From a95f983ea8665bfd14289b142cef1185838cc531 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 22 Dec 2016 22:52:15 +0100 Subject: [PATCH 001/586] Continue with 0.4.15-dev --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 11ebe94a1..99f54ba54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ set(VERSION_PATCH 15) set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string") # Change to false for releases -set(DEVELOPMENT_BUILD FALSE) +set(DEVELOPMENT_BUILD TRUE) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") if(VERSION_EXTRA) From a76e7698b21d51594d82e329d3825ee86e653295 Mon Sep 17 00:00:00 2001 From: Rogier Date: Mon, 25 Jul 2016 18:43:15 +0200 Subject: [PATCH 002/586] Make minetest abort on lua panic Currently, lua does a regular exit() after a lua panic, which can make a problem hard to debug. Invoking FATAL_ERROR() instead will print some useful information, and abort() minetest, so that a debugger can be used to analyze the situation. --- src/script/cpp_api/s_base.cpp | 13 +++++++++++++ src/script/cpp_api/s_base.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp index 679a517ee..cbe5735a7 100644 --- a/src/script/cpp_api/s_base.cpp +++ b/src/script/cpp_api/s_base.cpp @@ -40,6 +40,7 @@ extern "C" { #include #include +#include class ModNameStorer @@ -77,6 +78,8 @@ ScriptApiBase::ScriptApiBase() : m_luastack = luaL_newstate(); FATAL_ERROR_IF(!m_luastack, "luaL_newstate() failed"); + lua_atpanic(m_luastack, &luaPanic); + luaL_openlibs(m_luastack); // Make the ScriptApiBase* accessible to ModApiBase @@ -120,6 +123,16 @@ ScriptApiBase::~ScriptApiBase() lua_close(m_luastack); } +int ScriptApiBase::luaPanic(lua_State *L) +{ + std::ostringstream oss; + oss << "LUA PANIC: unprotected error in call to Lua API (" + << lua_tostring(L, -1) << ")"; + FATAL_ERROR(oss.str().c_str()); + // NOTREACHED + return 0; +} + void ScriptApiBase::loadMod(const std::string &script_path, const std::string &mod_name) { diff --git a/src/script/cpp_api/s_base.h b/src/script/cpp_api/s_base.h index f52474f00..c27235255 100644 --- a/src/script/cpp_api/s_base.h +++ b/src/script/cpp_api/s_base.h @@ -118,6 +118,8 @@ protected: #endif private: + static int luaPanic(lua_State *L); + lua_State* m_luastack; Server* m_server; From 923a8f1983271f65c80cbbde7c46153ce58560b4 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Wed, 7 Dec 2016 21:14:18 -0800 Subject: [PATCH 003/586] Shaders: Remove unnecessary 'if' statements Pull if GENERATE_NORMALMAPS == 1 into the template to avoid evaluating it for each fragment. Remove if (fogDistance != 0.0). --- .../shaders/nodes_shader/opengl_fragment.glsl | 31 +++++++++---------- .../water_surface_shader/opengl_fragment.glsl | 30 +++++++++--------- .../wielded_shader/opengl_fragment.glsl | 31 ++++++++++--------- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 71ded2b9d..914f9f873 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -163,7 +163,8 @@ void main(void) } #endif - if (GENERATE_NORMALMAPS == 1 && normalTexturePresent == false) { +#if GENERATE_NORMALMAPS == 1 + if (normalTexturePresent == false) { float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); @@ -177,7 +178,7 @@ void main(void) bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); use_normalmap = true; } - +#endif vec4 base = texture2D(baseTexture, uv).rgba; #ifdef ENABLE_BUMPMAPPING @@ -200,20 +201,18 @@ void main(void) col = applyToneMapping(col); #endif - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); col = vec4(col.rgb, base.a); gl_FragColor = col; diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index c4e78470d..19f6ac80f 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -114,7 +114,8 @@ void main(void) } #endif - if (GENERATE_NORMALMAPS == 1 && use_normalmap == false) { +#if GENERATE_NORMALMAPS == 1 + if (use_normalmap == false) { float tl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y+SAMPLE_STEP)); float t = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); float tr = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y+SAMPLE_STEP)); @@ -128,6 +129,7 @@ void main(void) bump = vec4 (normalize(vec3 (dX, -dY, NORMALMAPS_STRENGTH)),1.0); use_normalmap = true; } +#endif vec4 base = texture2D(baseTexture, uv).rgba; @@ -156,20 +158,18 @@ vec4 base = texture2D(baseTexture, uv).rgba; col = applyToneMapping(col); #endif - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); col = vec4(col.rgb, base.a); gl_FragColor = col; diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl index ba7a8f12d..546aef71d 100644 --- a/client/shaders/wielded_shader/opengl_fragment.glsl +++ b/client/shaders/wielded_shader/opengl_fragment.glsl @@ -75,7 +75,8 @@ void main(void) } #endif - if (GENERATE_NORMALMAPS == 1 && normalTexturePresent == false) { +#if GENERATE_NORMALMAPS == 1 + if (normalTexturePresent == false) { float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); @@ -89,6 +90,7 @@ void main(void) bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); use_normalmap = true; } +#endif vec4 base = texture2D(baseTexture, uv).rgba; @@ -108,19 +110,18 @@ void main(void) vec4 col = vec4(color.rgb, base.a); col *= gl_Color; - if (fogDistance != 0.0) { - // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), - // the fog will only be rendered correctly if the last operation before the - // clamp() is an addition. Else, the clamp() seems to be ignored. - // E.g. the following won't work: - // float clarity = clamp(fogShadingParameter - // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); - // As additions usually come for free following a multiplication, the new formula - // should be more efficient as well. - // Note: clarity = (1 - fogginess) - float clarity = clamp(fogShadingParameter - - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); - col = mix(skyBgColor, col, clarity); - } + // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?), + // the fog will only be rendered correctly if the last operation before the + // clamp() is an addition. Else, the clamp() seems to be ignored. + // E.g. the following won't work: + // float clarity = clamp(fogShadingParameter + // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0); + // As additions usually come for free following a multiplication, the new formula + // should be more efficient as well. + // Note: clarity = (1 - fogginess) + float clarity = clamp(fogShadingParameter + - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0); + col = mix(skyBgColor, col, clarity); + gl_FragColor = vec4(col.rgb, base.a); } From 2f59a0c840e9101c87e2d59fabf34116b3328121 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Sat, 10 Dec 2016 10:31:17 -0800 Subject: [PATCH 004/586] Process ABMs in a spherical volume instead of cubic Increase active_block_range default to a 3 mapblock radius. --- builtin/settingtypes.txt | 2 +- minetest.conf.example | 2 +- src/defaultsettings.cpp | 2 +- src/environment.cpp | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 1818b5a18..3a740f3ca 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -758,7 +758,7 @@ active_object_send_range_blocks (Active object send range) int 3 # How large area of blocks are subject to the active block stuff, stated in mapblocks (16 nodes). # In active blocks objects are loaded and ABMs run. -active_block_range (Active block range) int 2 +active_block_range (Active block range) int 3 # From how far blocks are sent to clients, stated in mapblocks (16 nodes). max_block_send_distance (Max block send distance) int 10 diff --git a/minetest.conf.example b/minetest.conf.example index 867d98584..b1d6c86bd 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -913,7 +913,7 @@ # How large area of blocks are subject to the active block stuff, stated in mapblocks (16 nodes). # In active blocks objects are loaded and ABMs run. # type: int -# active_block_range = 2 +# active_block_range = 3 # From how far blocks are sent to clients, stated in mapblocks (16 nodes). # type: int diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 0b4be6322..5bcd7da3d 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -273,7 +273,7 @@ void set_default_settings(Settings *settings) settings->setDefault("profiler_print_interval", "0"); settings->setDefault("enable_mapgen_debug_info", "false"); settings->setDefault("active_object_send_range_blocks", "3"); - settings->setDefault("active_block_range", "2"); + settings->setDefault("active_block_range", "3"); //settings->setDefault("max_simultaneous_block_sends_per_client", "1"); // This causes frametime jitter on client side, or does it? settings->setDefault("max_simultaneous_block_sends_per_client", "10"); diff --git a/src/environment.cpp b/src/environment.cpp index 13c64b37c..3d4a2efc1 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -397,8 +397,11 @@ void fillRadiusBlock(v3s16 p0, s16 r, std::set &list) for(p.Y=p0.Y-r; p.Y<=p0.Y+r; p.Y++) for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) { - // Set in list - list.insert(p); + // limit to a sphere + if (p.getDistanceFrom(p0) <= r) { + // Set in list + list.insert(p); + } } } From 4d4b8bb8a46b6472d86fa848954dbc26b4fadb50 Mon Sep 17 00:00:00 2001 From: Rogier Date: Tue, 13 Dec 2016 23:16:26 +0100 Subject: [PATCH 005/586] Move PP() and PP2() macros to basic_macros.h Instead of redefining them everywhere. --- src/clientmap.cpp | 3 +- src/content_abm.cpp | 2 -- src/content_cao.cpp | 3 +- src/database.h | 5 +-- src/environment.cpp | 3 +- src/inventorymanager.cpp | 3 +- src/map.cpp | 3 +- src/mapblock.cpp | 3 +- src/object_properties.cpp | 4 +-- src/pathfinder.cpp | 64 ++++++++++++++++++-------------------- src/rollback_interface.cpp | 3 +- src/server.h | 3 +- src/util/basic_macros.h | 9 ++++++ 13 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/clientmap.cpp b/src/clientmap.cpp index faa1461f6..27f9dea38 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -30,10 +30,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "camera.h" // CameraModes #include "util/mathconstants.h" +#include "util/basic_macros.h" #include -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - ClientMap::ClientMap( Client *client, IGameDef *gamedef, diff --git a/src/content_abm.cpp b/src/content_abm.cpp index 8694ef981..ee444ae77 100644 --- a/src/content_abm.cpp +++ b/src/content_abm.cpp @@ -29,8 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "scripting_game.h" #include "log.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef) { } diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 6b35d5881..a02d5168e 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" // For IntervalLimiter #include "util/serialize.h" #include "util/mathconstants.h" +#include "util/basic_macros.h" #include "client/tile.h" #include "environment.h" #include "collision.h" @@ -49,8 +50,6 @@ with this program; if not, write to the Free Software Foundation, Inc., class Settings; struct ToolCapabilities; -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - UNORDERED_MAP ClientActiveObject::m_types; SmoothTranslator::SmoothTranslator(): diff --git a/src/database.h b/src/database.h index 0cf75232f..459789306 100644 --- a/src/database.h +++ b/src/database.h @@ -24,10 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "irr_v3d.h" #include "irrlichttypes.h" - -#ifndef PP - #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -#endif +#include "util/basic_macros.h" class Database { diff --git a/src/environment.cpp b/src/environment.cpp index 3d4a2efc1..707d89659 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -44,10 +44,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "emerge.h" #include "util/serialize.h" +#include "util/basic_macros.h" #include "threading/mutex_auto_lock.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - #define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" // A number that is much smaller than the timeout for particle spawners should/could ever be diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 3d8513492..f36a2fa4e 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -26,8 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "craftdef.h" #include "rollback_interface.h" #include "util/strfnd.h" - -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" +#include "util/basic_macros.h" #define PLAYER_TO_SA(p) p->getEnv()->getScriptIface() diff --git a/src/map.cpp b/src/map.cpp index 7bb8c4a13..c3b62ded0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "util/directiontables.h" #include "util/mathconstants.h" +#include "util/basic_macros.h" #include "rollback_interface.h" #include "environment.h" #include "reflowscan.h" @@ -56,8 +57,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database-postgresql.h" #endif -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - /* Map diff --git a/src/mapblock.cpp b/src/mapblock.cpp index f8747f52b..f8c3197bc 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -35,8 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif #include "util/string.h" #include "util/serialize.h" - -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" +#include "util/basic_macros.h" static const char *modified_reason_strings[] = { "initial", diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 89ca26274..f4e4953ba 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -21,11 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "exceptions.h" #include "util/serialize.h" +#include "util/basic_macros.h" #include -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -#define PP2(x) "("<<(x).X<<","<<(x).Y<<")" - ObjectProperties::ObjectProperties(): hp_max(1), physical(false), diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 57a008ead..073670c6d 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "log.h" #include "irr_aabb3d.h" +#include "util/basic_macros.h" //#define PATHFINDER_DEBUG //#define PATHFINDER_CALC_TIME @@ -47,9 +48,6 @@ with this program; if not, write to the Free Software Foundation, Inc., /* Typedefs and macros */ /******************************************************************************/ -/** shortcut to print a 3d pos */ -#define PPOS(pos) "(" << pos.X << "," << pos.Y << "," << pos.Z << ")" - #define LVL "(" << level << ")" << #ifdef PATHFINDER_DEBUG @@ -531,25 +529,25 @@ void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node) if ((current.param0 == CONTENT_IGNORE) || (below.param0 == CONTENT_IGNORE)) { - DEBUG_OUT("Pathfinder: " << PPOS(realpos) << + DEBUG_OUT("Pathfinder: " << PP(realpos) << " current or below is invalid element" << std::endl); if (current.param0 == CONTENT_IGNORE) { elem.type = 'i'; - DEBUG_OUT(PPOS(ipos) << ": " << 'i' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 'i' << std::endl); } return; } //don't add anything if it isn't an air node if (ndef->get(current).walkable || !ndef->get(below).walkable) { - DEBUG_OUT("Pathfinder: " << PPOS(realpos) + DEBUG_OUT("Pathfinder: " << PP(realpos) << " not on surface" << std::endl); if (ndef->get(current).walkable) { elem.type = 's'; - DEBUG_OUT(PPOS(ipos) << ": " << 's' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 's' << std::endl); } else { elem.type = '-'; - DEBUG_OUT(PPOS(ipos) << ": " << '-' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << '-' << std::endl); } return; } @@ -557,7 +555,7 @@ void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node) elem.valid = true; elem.pos = realpos; elem.type = 'g'; - DEBUG_OUT(PPOS(ipos) << ": " << 'a' << std::endl); + DEBUG_OUT(PP(ipos) << ": " << 'a' << std::endl); if (m_pathf->m_prefetch) { elem.directions[DIR_XP] = m_pathf->calcCost(realpos, v3s16( 1, 0, 0)); @@ -686,14 +684,14 @@ std::vector Pathfinder::getPath(ServerEnvironment *env, if (!startpos.valid) { VERBOSE_TARGET << "invalid startpos" << - "Index: " << PPOS(StartIndex) << - "Realpos: " << PPOS(getRealPos(StartIndex)) << std::endl; + "Index: " << PP(StartIndex) << + "Realpos: " << PP(getRealPos(StartIndex)) << std::endl; return retval; } if (!endpos.valid) { VERBOSE_TARGET << "invalid stoppos" << - "Index: " << PPOS(EndIndex) << - "Realpos: " << PPOS(getRealPos(EndIndex)) << std::endl; + "Index: " << PP(EndIndex) << + "Realpos: " << PP(getRealPos(EndIndex)) << std::endl; return retval; } @@ -809,7 +807,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //check limits if (!m_limits.isPointInside(pos2)) { - DEBUG_OUT("Pathfinder: " << PPOS(pos2) << + DEBUG_OUT("Pathfinder: " << PP(pos2) << " no cost -> out of limits" << std::endl); return retval; } @@ -819,7 +817,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //did we get information about node? if (node_at_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (1) area at pos: " - << PPOS(pos2) << " not loaded"; + << PP(pos2) << " not loaded"; return retval; } @@ -830,7 +828,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) //did we get information about node? if (node_below_pos2.param0 == CONTENT_IGNORE ) { VERBOSE_TARGET << "Pathfinder: (2) area at pos: " - << PPOS((pos2 + v3s16(0, -1, 0))) << " not loaded"; + << PP((pos2 + v3s16(0, -1, 0))) << " not loaded"; return retval; } @@ -838,7 +836,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir) retval.valid = true; retval.value = 1; retval.direction = 0; - DEBUG_OUT("Pathfinder: "<< PPOS(pos) + DEBUG_OUT("Pathfinder: "<< PP(pos) << " cost same height found" << std::endl); } else { @@ -991,8 +989,8 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, v3s16 ipos2 = ipos + directions[i]; if (!isValidIndex(ipos2)) { - DEBUG_OUT(LVL " Pathfinder: " << PPOS(ipos2) << - " out of range, max=" << PPOS(m_limits.MaxEdge) << std::endl); + DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << + " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); continue; } @@ -1000,7 +998,7 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " - << PPOS(ipos2) << std::endl; + << PP(ipos2) << std::endl; continue; } @@ -1017,7 +1015,7 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< - PPOS(ipos2) << " from: " << g_pos2.totalcost << " to "<< + PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << std::endl); if (updateAllCosts(ipos2, invert(directions[i]), new_cost, level)) { @@ -1027,13 +1025,13 @@ bool Pathfinder::updateAllCosts(v3s16 ipos, else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " - << PPOS(directions[i]) << std::endl); + << PP(directions[i]) << std::endl); } } } @@ -1147,8 +1145,8 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, v3s16 ipos2 = ipos + direction; if (!isValidIndex(ipos2)) { - DEBUG_OUT(LVL " Pathfinder: " << PPOS(ipos2) << - " out of range, max=" << PPOS(m_limits.MaxEdge) << std::endl); + DEBUG_OUT(LVL " Pathfinder: " << PP(ipos2) << + " out of range, max=" << PP(m_limits.MaxEdge) << std::endl); direction = getDirHeuristic(directions, g_pos); continue; } @@ -1157,7 +1155,7 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, if (!g_pos2.valid) { VERBOSE_TARGET << LVL "Pathfinder: no data for new position: " - << PPOS(ipos2) << std::endl; + << PP(ipos2) << std::endl; direction = getDirHeuristic(directions, g_pos); continue; } @@ -1171,16 +1169,16 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, (m_min_target_distance < new_cost)) { DEBUG_OUT(LVL "Pathfinder:" " already longer than best already found path " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); return false; } if ((g_pos2.totalcost < 0) || (g_pos2.totalcost > new_cost)) { DEBUG_OUT(LVL "Pathfinder: updating path at: "<< - PPOS(ipos2) << " from: " << g_pos2.totalcost << " to "<< + PP(ipos2) << " from: " << g_pos2.totalcost << " to "<< new_cost << " srcdir=" << - PPOS(invert(direction))<< std::endl); + PP(invert(direction))<< std::endl); if (updateCostHeuristic(ipos2, invert(direction), new_cost, level)) { retval = true; @@ -1189,19 +1187,19 @@ bool Pathfinder::updateCostHeuristic( v3s16 ipos, else { DEBUG_OUT(LVL "Pathfinder:" " already found shorter path to: " - << PPOS(ipos2) << std::endl); + << PP(ipos2) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " not moving to invalid direction: " - << PPOS(direction) << std::endl); + << PP(direction) << std::endl); } } else { DEBUG_OUT(LVL "Pathfinder:" " skipping srcdir: " - << PPOS(direction) << std::endl); + << PP(direction) << std::endl); } direction = getDirHeuristic(directions, g_pos); } @@ -1409,7 +1407,7 @@ void Pathfinder::printPath(std::vector path) unsigned int current = 0; for (std::vector::iterator i = path.begin(); i != path.end(); ++i) { - std::cout << std::setw(3) << current << ":" << PPOS((*i)) << std::endl; + std::cout << std::setw(3) << current << ":" << PP((*i)) << std::endl; current++; } } diff --git a/src/rollback_interface.cpp b/src/rollback_interface.cpp index bffe0a82c..7345c4a7d 100644 --- a/src/rollback_interface.cpp +++ b/src/rollback_interface.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "util/string.h" #include "util/numeric.h" +#include "util/basic_macros.h" #include "map.h" #include "gamedef.h" #include "nodedef.h" @@ -32,8 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventory.h" #include "mapblock.h" -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - RollbackNode::RollbackNode(Map *map, v3s16 p, IGameDef *gamedef) { diff --git a/src/server.h b/src/server.h index 4425d139b..cab7e2445 100644 --- a/src/server.h +++ b/src/server.h @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "subgame.h" #include "util/numeric.h" #include "util/thread.h" +#include "util/basic_macros.h" #include "environment.h" #include "chat_interface.h" #include "clientiface.h" @@ -41,8 +42,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - class IWritableItemDefManager; class IWritableNodeDefManager; class IWritableCraftDefManager; diff --git a/src/util/basic_macros.h b/src/util/basic_macros.h index c100b4f25..bd4b890eb 100644 --- a/src/util/basic_macros.h +++ b/src/util/basic_macros.h @@ -50,4 +50,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #define STATIC_ASSERT(expr, msg) \ UNUSED_ATTRIBUTE typedef char msg[!!(expr) * 2 - 1] +// Macros to facilitate writing position vectors to a stream +// Usage: +// v3s16 pos(1,2,3); +// mystream << "message " << PP(pos) << std::endl; + +#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" + +#define PP2(x) "("<<(x).X<<","<<(x).Y<<")" + #endif From f4d718c53843c5e18243d0851b9c7790b0853334 Mon Sep 17 00:00:00 2001 From: Rogier Date: Wed, 14 Dec 2016 16:23:25 +0100 Subject: [PATCH 006/586] Minimal game: Use field 'tiles' instead of 'tile_images' --- games/minimal/mods/experimental/init.lua | 6 +++--- games/minimal/mods/stairs/init.lua | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index 729191bce..142734cda 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -28,7 +28,7 @@ minetest.after(1.0, switch_player_visual) ]] minetest.register_node("experimental:soundblock", { - tile_images = {"unknown_node.png", "default_tnt_bottom.png", + tiles = {"unknown_node.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png"}, inventory_image = minetest.inventorycube("unknown_node.png", @@ -120,7 +120,7 @@ minetest.register_craft({ }) minetest.register_node("experimental:tnt", { - tile_images = {"default_tnt_top.png", "default_tnt_bottom.png", + tiles = {"default_tnt_top.png", "default_tnt_bottom.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png", "default_tnt_side.png"}, inventory_image = minetest.inventorycube("default_tnt_top.png", @@ -453,7 +453,7 @@ minetest.register_abm({ minetest.register_node("experimental:tester_node_1", { description = "Tester Node 1 (construct/destruct/timer)", - tile_images = {"wieldhand.png"}, + tiles = {"wieldhand.png"}, groups = {oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), -- This was known to cause a bug in minetest.item_place_node() when used diff --git a/games/minimal/mods/stairs/init.lua b/games/minimal/mods/stairs/init.lua index 4929d1370..c3bbc561e 100644 --- a/games/minimal/mods/stairs/init.lua +++ b/games/minimal/mods/stairs/init.lua @@ -5,7 +5,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description) minetest.register_node("stairs:stair_" .. subname, { description = description, drawtype = "nodebox", - tile_images = images, + tiles = images, paramtype = "light", paramtype2 = "facedir", is_ground_content = true, @@ -34,7 +34,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description) minetest.register_node("stairs:slab_" .. subname, { description = description, drawtype = "nodebox", - tile_images = images, + tiles = images, paramtype = "light", is_ground_content = true, groups = groups, From e3cbe521fc72191da5a3e8ead499cf19e02aca7b Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 24 Dec 2016 07:34:19 +0000 Subject: [PATCH 007/586] Update Android build tools to latest version (#4872) --- build/android/build.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build/android/build.gradle b/build/android/build.gradle index 20c13e385..745952a22 100644 --- a/build/android/build.gradle +++ b/build/android/build.gradle @@ -10,8 +10,8 @@ buildscript { apply plugin: "com.android.application" android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.1" defaultConfig { versionCode 16 @@ -46,4 +46,3 @@ android { } } } - From b95f543da9d56974c4db8e34ce93e6f3bf7e776c Mon Sep 17 00:00:00 2001 From: Ner'zhul Date: Sat, 24 Dec 2016 12:30:18 +0100 Subject: [PATCH 008/586] Add gradle wrapper (#4954) Gradle wrapper permit to use multiple gradle versions across OS versions --- build/android/Makefile | 4 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + build/android/gradlew | 164 ++++++++++++++++++ build/android/gradlew.bat | 90 ++++++++++ 5 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 build/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 build/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 build/android/gradlew create mode 100644 build/android/gradlew.bat diff --git a/build/android/Makefile b/build/android/Makefile index 6e7a389c9..d261a0e95 100644 --- a/build/android/Makefile +++ b/build/android/Makefile @@ -781,7 +781,7 @@ apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) fi; \ export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \ export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \ - gradle assemble$$BUILD_TYPE_C && \ + ./gradlew assemble$$BUILD_TYPE_C && \ echo "APK stored at: build/outputs/apk/Minetest-$$BUILD_TYPE.apk" && \ echo "You can install it with \`make install_$$BUILD_TYPE\`" @@ -799,7 +799,7 @@ prep_srcdir : fi clean_apk : - gradle clean + ./gradlew clean clean_all : @$(MAKE) clean_apk; \ diff --git a/build/android/gradle/wrapper/gradle-wrapper.jar b/build/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/build/android/gradlew.bat b/build/android/gradlew.bat new file mode 100644 index 000000000..8a0b282aa --- /dev/null +++ b/build/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From b16252dcae8c6b0e79c20fa4c3cbddc37ad377cb Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 22 Dec 2016 19:29:15 +0100 Subject: [PATCH 009/586] Various anticheat improvements * Calculate maximum interact distance from wielded tool * New "interacted_while_dead" cheat_type for the Lua API * Disallow dropping items while dead * Move player to spawn before resurrecting them --- doc/lua_api.txt | 7 ++- src/network/serverpackethandler.cpp | 86 ++++++++++++++++++----------- src/server.cpp | 8 +-- 3 files changed, 61 insertions(+), 40 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 34c64b8df..d2ddc635b 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2036,9 +2036,10 @@ Call these functions only at load time! * `minetest.register_on_cheat(func(ObjectRef, cheat))` * Called when a player cheats * `cheat`: `{type=}`, where `` is one of: - * `"moved_too_fast"` - * `"interacted_too_far"` - * `"finished_unknown_dig"` + * `moved_too_fast` + * `interacted_too_far` + * `interacted_while_dead` + * `finished_unknown_dig` * `dug_unbreakable` * `dug_too_fast` * `minetest.register_on_chat_message(func(name, message))` diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index dca9aabc4..f99e104ec 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1021,6 +1021,15 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) delete a; return; } + + // Disallow dropping items if dead + if (playersao->isDead()) { + infostream << "Ignoring IDropAction from " + << (da->from_inv.dump()) << ":" << da->from_list + << " because player is dead." << std::endl; + delete a; + return; + } } /* Handle restrictions and special cases of the craft action @@ -1313,6 +1322,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) 2: digging completed 3: place block or item (to abovesurface) 4: use item + 5: rightclick air ("activate") */ u8 action; u16 item_i; @@ -1345,8 +1355,16 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) } if (playersao->isDead()) { - verbosestream << "TOSERVER_INTERACT: " << player->getName() - << " is dead. Ignoring packet"; + actionstream << "Server: NoCheat: " << player->getName() + << " tried to interact while dead; ignoring." << std::endl; + if (pointed.type == POINTEDTHING_NODE) { + // Re-send block to revert change on client-side + RemoteClient *client = getClient(pkt->getPeerId()); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); + client->SetBlockNotSent(blockpos); + } + // Call callbacks + m_script->on_cheat(playersao, "interacted_while_dead"); return; } @@ -1384,32 +1402,6 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) pointed_pos_above = pointed_pos_under; } - /* - Check that target is reasonably close - (only when digging or placing things) - */ - 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) { - actionstream << "Player " << player->getName() - << " tried to access " << pointed.dump() - << " from too far: " - << "d=" << d <<", max_d=" << max_d - << ". ignoring." << std::endl; - // Re-send block to revert change on client-side - RemoteClient *client = getClient(pkt->getPeerId()); - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); - client->SetBlockNotSent(blockpos); - // Call callbacks - m_script->on_cheat(playersao, "interacted_too_far"); - // Do nothing else - return; - } - } - /* Make sure the player is allowed to do it */ @@ -1432,6 +1424,39 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) return; } + /* + Check that target is reasonably close + (only when digging or placing things) + */ + static const bool enable_anticheat = !g_settings->getBool("disable_anticheat"); + if ((action == 0 || action == 2 || action == 3 || action == 4) && + (enable_anticheat && !isSingleplayer())) { + float d = player_pos.getDistanceFrom(pointed_pos_under); + const ItemDefinition &playeritem_def = + playersao->getWieldedItem().getDefinition(m_itemdef); + float max_d = BS * playeritem_def.range; + float max_d_hand = BS * m_itemdef->get("").range; + if (max_d < 0 && max_d_hand >= 0) + max_d = max_d_hand; + else if (max_d < 0) + max_d = BS * 4.0; + if (d > max_d * 1.5) { + actionstream << "Player " << player->getName() + << " tried to access " << pointed.dump() + << " from too far: " + << "d=" << d <<", max_d=" << max_d + << ". ignoring." << std::endl; + // Re-send block to revert change on client-side + RemoteClient *client = getClient(pkt->getPeerId()); + v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); + client->SetBlockNotSent(blockpos); + // Call callbacks + m_script->on_cheat(playersao, "interacted_too_far"); + // Do nothing else + return; + } + } + /* If something goes wrong, this player is to blame */ @@ -1443,11 +1468,6 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) */ if (action == 0) { if (pointed.type == POINTEDTHING_NODE) { - /* - NOTE: This can be used in the future to check if - somebody is cheating, by checking the timing. - */ - MapNode n(CONTENT_IGNORE); bool pos_ok; diff --git a/src/server.cpp b/src/server.cpp index c9d5c7129..fa7a838d4 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2557,15 +2557,15 @@ void Server::RespawnPlayer(u16 peer_id) playersao->setHP(PLAYER_MAX_HP); playersao->setBreath(PLAYER_MAX_BREATH); - SendPlayerHP(peer_id); - SendPlayerBreath(peer_id); - bool repositioned = m_script->on_respawnplayer(playersao); - if(!repositioned){ + if (!repositioned) { v3f pos = findSpawnPos(); // setPos will send the new position to client playersao->setPos(pos); } + + SendPlayerHP(peer_id); + SendPlayerBreath(peer_id); } From 084cdea6862cb65fe4bb807a211a9e1c17cffec8 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 24 Dec 2016 14:26:03 +0100 Subject: [PATCH 010/586] Irrlicht 1.9 support --- src/cguittfont/CGUITTFont.h | 7 +++++++ src/client/tile.cpp | 2 +- src/drawscene.cpp | 5 +++++ src/game.cpp | 2 ++ src/guiChatConsole.cpp | 2 +- src/irrlicht_changes/static_text.cpp | 4 ++++ 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/cguittfont/CGUITTFont.h b/src/cguittfont/CGUITTFont.h index 0aa540c5c..77c9e34f8 100644 --- a/src/cguittfont/CGUITTFont.h +++ b/src/cguittfont/CGUITTFont.h @@ -125,6 +125,10 @@ namespace gui bool flgmip = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + bool flgcpy = driver->getTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY); + driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, true); +#endif // Set the texture color format. switch (pixel_mode) @@ -140,6 +144,9 @@ namespace gui // Restore our texture creation flags. driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, flgmip); +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + driver->setTextureCreationFlag(video::ETCF_ALLOW_MEMORY_COPY, flgcpy); +#endif return texture ? true : false; } diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 8f0c39465..7f7535df6 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -938,7 +938,7 @@ video::ITexture* TextureSource::generateTextureFromMesh( smgr->drop(); // Unset render target - driver->setRenderTarget(0, false, true, 0); + driver->setRenderTarget(0, false, true, video::SColor(0,0,0,0)); if (params.delete_texture_on_shutdown) m_texture_trash.push_back(rtt); diff --git a/src/drawscene.cpp b/src/drawscene.cpp index c6abda4ac..32a078b8e 100644 --- a/src/drawscene.cpp +++ b/src/drawscene.cpp @@ -383,6 +383,10 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud, bool draw_wield_tool, Client& client, gui::IGUIEnvironment* guienv, video::SColor skycolor) { +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + errorstream << "Pageflip 3D mode is not supported" + << " with your Irrlicht version!" << std::endl; +#else /* preserve old setup*/ irr::core::vector3df oldPosition = camera.getCameraNode()->getPosition(); irr::core::vector3df oldTarget = camera.getCameraNode()->getTarget(); @@ -451,6 +455,7 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud, camera.getCameraNode()->setPosition(oldPosition); camera.getCameraNode()->setTarget(oldTarget); +#endif } void draw_plain(Camera &camera, bool show_hud, Hud &hud, diff --git a/src/game.cpp b/src/game.cpp index 966c23073..5bdbea617 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2071,9 +2071,11 @@ void Game::run() void Game::shutdown() { +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8 if (g_settings->get("3d_mode") == "pageflip") { driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS); } +#endif showOverlayMessage(wgettext("Shutting down..."), 0, 0, false); diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp index 8dd5ab032..867576175 100644 --- a/src/guiChatConsole.cpp +++ b/src/guiChatConsole.cpp @@ -630,7 +630,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event) } else if(event.KeyInput.Char != 0 && !event.KeyInput.Control) { - #if (defined(__linux__)) + #if defined(__linux__) && (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9) wchar_t wc = L'_'; mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) ); prompt.input(wc); diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp index 703287eb3..50c6c6a68 100644 --- a/src/irrlicht_changes/static_text.cpp +++ b/src/irrlicht_changes/static_text.cpp @@ -20,6 +20,10 @@ #if USE_FREETYPE #include "cguittfont/xCGUITTFont.h" #endif +#ifndef _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX + // newer Irrlicht versions no longer have this + #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX +#endif #include "util/string.h" From 5a0a59ad463143d4452524837d69c108908f20d5 Mon Sep 17 00:00:00 2001 From: adrido Date: Wed, 28 Dec 2016 21:22:01 +0100 Subject: [PATCH 011/586] Dont compare short with bool (#4963) Fixes a compiler warning on MSVC --- src/script/lua_api/l_util.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp index 26e2b985c..c26791646 100644 --- a/src/script/lua_api/l_util.cpp +++ b/src/script/lua_api/l_util.cpp @@ -398,7 +398,8 @@ int ModApiUtil::l_get_dir_list(lua_State *L) { NO_MAP_LOCK_REQUIRED; const char *path = luaL_checkstring(L, 1); - short is_dir = lua_isboolean(L, 2) ? lua_toboolean(L, 2) : -1; + bool list_all = !lua_isboolean(L, 2); // if its not a boolean list all + bool list_dirs = lua_toboolean(L, 2); // true: list dirs, false: list files CHECK_SECURE_PATH(L, path, false); @@ -408,7 +409,7 @@ int ModApiUtil::l_get_dir_list(lua_State *L) lua_newtable(L); for (size_t i = 0; i < list.size(); i++) { - if (is_dir == -1 || is_dir == list[i].dir) { + if (list_all || list_dirs == list[i].dir) { lua_pushstring(L, list[i].name.c_str()); lua_rawseti(L, -2, ++index); } From 094a5a73d3b9817d07c52754749f0828c4005b8c Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 8 Dec 2016 17:37:13 -0800 Subject: [PATCH 012/586] Redo light.cpp. Remake the light_decode_table. The table starts out without pre-filled in values since those are always discarded by the code apparently. We calculate a pseudo curve with gamma power function, and then apply a new adjustment table. The adjustment table is setup to make the default gamma of 2.2 look decent: not too dark at light level 3 or so, but too dark at 1 and below to be playable. The curve is much smoother than before and looks reasonable at the whole range, offering a pleasant decay of light levels away from lights. The `display_gamma` setting now actually does something logical: the game is darker at values below 2.2, and brighter at values above 2.2. At 3.0, the game is very bright, but still has a good light scale. At 1.1 or so, the bottom 5 light levels are virtually black, but you can still see enough detail at light levels 7-8, so the range and spread is adequate. I must add that my monitor is somewhat dark to begin with, since I have a `hc` screen that doesn't dynamic range colors or try to pull up `black` pixels for me (it is tuned for accurate color and light levels), so this should look even better on more dynamic display tunings. --- builtin/settingtypes.txt | 4 +- minetest.conf.example | 2 +- src/defaultsettings.cpp | 2 +- src/light.cpp | 351 +++------------------------------------ 4 files changed, 28 insertions(+), 331 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 3a740f3ca..8668e1472 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -442,9 +442,9 @@ fov (Field of view) int 72 30 160 # This requires the "zoom" privilege on the server. zoom_fov (Field of view for zoom) int 15 15 160 -# Adjust the gamma encoding for the light tables. Lower numbers are brighter. +# Adjust the gamma encoding for the light tables. Higher numbers are brighter. # This setting is for the client only and is ignored by the server. -display_gamma (Gamma) float 1.8 1.0 3.0 +display_gamma (Gamma) float 2.2 1.0 3.0 # Path to texture directory. All textures are first searched from here. texture_path (Texture path) path diff --git a/minetest.conf.example b/minetest.conf.example index b1d6c86bd..262f95115 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -508,7 +508,7 @@ # Adjust the gamma encoding for the light tables. Lower numbers are brighter. # This setting is for the client only and is ignored by the server. # type: float min: 1 max: 3 -# display_gamma = 1.8 +# display_gamma = 2.2 # Path to texture directory. All textures are first searched from here. # type: path diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 5bcd7da3d..52f4cfec8 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -112,7 +112,7 @@ void set_default_settings(Settings *settings) settings->setDefault("leaves_style", "fancy"); settings->setDefault("connected_glass", "false"); settings->setDefault("smooth_lighting", "true"); - settings->setDefault("display_gamma", "1.8"); + settings->setDefault("display_gamma", "2.2"); settings->setDefault("texture_path", ""); settings->setDefault("shader_path", ""); settings->setDefault("video_driver", "opengl"); diff --git a/src/light.cpp b/src/light.cpp index 5dc01fcf0..4a3ca5a60 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -26,29 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc., // Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. // LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_LUT[LIGHT_MAX+1] = -{ - /* Middle-raised variation of a_n+1 = a_n * 0.786 - * Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. - * LIGHT_SUN is read as LIGHT_MAX from here. - */ - 8, - 11+2, - 14+7, - 18+10, - 22+15, - 29+20, - 37+20, - 47+15, - 60+10, - 76+7, - 97+5, - 123+2, - 157, - 200, - 255, -}; +u8 light_LUT[LIGHT_MAX+1]; +// the const ref to light_LUT is what is actually used in the code. const u8 *light_decode_table = light_LUT; /** Initialize or update the light value tables using the specified \p gamma. @@ -65,26 +45,26 @@ void set_light_table(float gamma) { static const float brightness_step = 255.0f / (LIGHT_MAX + 1); - /* These are adjustment values that are added to the calculated light value - * after gamma is applied. Currently they are used so that given a gamma - * of 1.8 the light values set by this function are the same as those - * hardcoded in the initalizer list for the declaration of light_LUT. - */ + // this table is pure arbitrary values, made so that + // at gamma 2.2 the game looks not too dark at light=1, + // and mostly linear for the rest of the scale. + // we could try to inverse the gamma power function, but this + // is simpler and quicker. static const int adjustments[LIGHT_MAX + 1] = { - 7, - 7, - 7, - 5, - 2, - 0, - -7, - -20, - -31, - -39, - -43, - -45, - -40, - -25, + -67, + -91, + -125, + -115, + -104, + -85, + -70, + -63, + -56, + -49, + -42, + -35, + -28, + -22, 0 }; @@ -93,296 +73,13 @@ void set_light_table(float gamma) float brightness = brightness_step; for (size_t i = 0; i < LIGHT_MAX; i++) { - light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, gamma)); + light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, 1.0 / gamma)); light_LUT[i] = rangelim(light_LUT[i] + adjustments[i], 0, 255); - if (i > 1 && light_LUT[i] < light_LUT[i-1]) - light_LUT[i] = light_LUT[i-1] + 1; + if (i > 1 && light_LUT[i] < light_LUT[i - 1]) + light_LUT[i] = light_LUT[i - 1] + 1; brightness += brightness_step; } light_LUT[LIGHT_MAX] = 255; } #endif - - -#if 0 -/* -Made using this and: -- adding 220 as the second last one -- replacing the third last one (212) with 195 - -#!/usr/bin/python - -from math import * -from sys import stdout - -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -#FACTOR = 0.75 -FACTOR = 0.83 -START_FROM_ZERO = False - -L = [] -if START_FROM_ZERO: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(0) -else: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(255) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -23, -27, -33, -40, -48, -57, -69, -83, -100, -121, -146, -176, -195, -220, -255, -}; -#endif - -#if 0 -// This is good -// a_n+1 = a_n * 0.786 -// Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. -// LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11, -14, -18, -22, -29, -37, -47, -60, -76, -97, -123, -157, -200, -255, -}; -#endif - -#if 0 -// Use for debugging in dark -u8 light_decode_table[LIGHT_MAX+1] = -{ -58, -64, -72, -80, -88, -98, -109, -121, -135, -150, -167, -185, -206, -229, -255, -}; -#endif - -// This is reasonable with classic lighting with a light source -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -2, -3, -4, -6, -9, -13, -18, -25, -32, -35, -45, -57, -69, -79, -255 -};*/ - - -// As in minecraft, a_n+1 = a_n * 0.8 -// NOTE: This doesn't really work that well because this defines -// LIGHT_MAX as dimmer than LIGHT_SUN -// NOTE: Uh, this has had 34 left out; forget this. -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11, -14, -17, -21, -27, -42, -53, -66, -83, -104, -130, -163, -204, -255, -};*/ - -// This was a quick try of more light, manually quickly made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -7, -11, -15, -21, -29, -42, -53, -69, -85, -109, -135, -167, -205, -255, -};*/ - -// This was used for a long time, manually made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -3, -6, -10, -18, -25, -35, -50, -75, -95, -120, -150, -185, -215, -255, -};*/ -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -5, -12, -22, -35, -50, -65, -85, -100, -120, -140, -160, -185, -215, -255, -};*/ -// LIGHT_MAX is 14, 0-14 is 15 values -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -9, -12, -14, -16, -20, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -#if 0 -/* -#!/usr/bin/python - -from math import * -from sys import stdout - -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -FACTOR = 0.75 - -L = [] -for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) -L.append(0) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -}; -#endif - - From e509ead680cc1c0bde35dfd467d18b8288cc1b86 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 29 Dec 2016 13:17:24 +0100 Subject: [PATCH 013/586] Buildbot: Update Gettext version (#4971) --- util/buildbot/buildwin32.sh | 9 ++++----- util/buildbot/buildwin64.sh | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh index e58c25ccc..d807003d2 100755 --- a/util/buildbot/buildwin32.sh +++ b/util/buildbot/buildwin32.sh @@ -17,7 +17,7 @@ irrlicht_version=1.8.4 ogg_version=1.3.2 vorbis_version=1.3.5 curl_version=7.50.3 -gettext_version=0.14.4 +gettext_version=0.19.8.1 freetype_version=2.7 sqlite3_version=3.14.2 luajit_version=2.1.0-beta2 @@ -40,7 +40,7 @@ cd $builddir -c -O $packagedir/libvorbis-$vorbis_version.zip [ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip \ -c -O $packagedir/curl-$curl_version.zip -[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version.zip \ +[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win32.zip \ -c -O $packagedir/gettext-$gettext_version.zip [ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip \ -c -O $packagedir/freetype2-$freetype_version.zip @@ -130,10 +130,9 @@ cmake .. \ -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ \ - -DCUSTOM_GETTEXT_PATH=$libdir/gettext \ -DGETTEXT_MSGFMT=`which msgfmt` \ - -DGETTEXT_DLL=$libdir/gettext/bin/libintl3.dll \ - -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv2.dll \ + -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ + -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \ -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \ \ diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh index 1c31fe4bd..3d6965f1e 100755 --- a/util/buildbot/buildwin64.sh +++ b/util/buildbot/buildwin64.sh @@ -17,7 +17,7 @@ irrlicht_version=1.8.4 ogg_version=1.3.2 vorbis_version=1.3.5 curl_version=7.50.3 -gettext_version=0.18.2 +gettext_version=0.19.8.1 freetype_version=2.7 sqlite3_version=3.14.2 luajit_version=2.1.0-beta2 @@ -131,7 +131,6 @@ cmake .. \ -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ \ - -DCUSTOM_GETTEXT_PATH=$libdir/gettext \ -DGETTEXT_MSGFMT=`which msgfmt` \ -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ From abd68d3466b7f2155cf0f1c4172a254f10c1f02e Mon Sep 17 00:00:00 2001 From: Rogier-5 Date: Thu, 29 Dec 2016 13:44:47 +0100 Subject: [PATCH 014/586] Use the outgoing split sequence number for every outgoing packet (#4864) (instead of the last incoming sequence number...) Fixes #4848 --- src/network/connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/connection.cpp b/src/network/connection.cpp index b711cae11..e11b4a953 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -1237,7 +1237,7 @@ void UDPPeer::RunCommandQueues( u16 UDPPeer::getNextSplitSequenceNumber(u8 channel) { assert(channel < CHANNEL_COUNT); // Pre-condition - return channels[channel].readNextIncomingSeqNum(); + return channels[channel].readNextSplitSeqNum(); } void UDPPeer::setNextSplitSequenceNumber(u8 channel, u16 seqnum) From dd3cda6bedf0ed7443258f33d5a5cf68fa120534 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 29 Dec 2016 19:35:22 +0100 Subject: [PATCH 015/586] Fix interact range check (thanks to @lhofhansl) --- src/network/serverpackethandler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index f99e104ec..d0f4d948d 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1440,7 +1440,8 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) max_d = max_d_hand; else if (max_d < 0) max_d = BS * 4.0; - if (d > max_d * 1.5) { + // cube diagonal: sqrt(3) = 1.73 + if (d > max_d * 1.73) { actionstream << "Player " << player->getName() << " tried to access " << pointed.dump() << " from too far: " From a1346c916e1d0f0cde2ccecc680857896c717a3d Mon Sep 17 00:00:00 2001 From: Dorian Wouters Date: Sat, 31 Dec 2016 18:12:26 +0100 Subject: [PATCH 016/586] Fix /grant & /revoke not working with custom auth handler (#4974) core.auth_table is not supposed to be accessed directly. --- builtin/game/chatcommands.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 2bd93855b..71edeb26a 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -162,7 +162,7 @@ local function handle_grant_command(caller, grantname, grantprivstr) return false, "Your privileges are insufficient." end - if not core.auth_table[grantname] then + if not core.get_auth_handler().get_auth(grantname) then return false, "Player " .. grantname .. " does not exist." end local grantprivs = core.string_to_privs(grantprivstr) @@ -232,7 +232,7 @@ core.register_chatcommand("revoke", { local revoke_name, revoke_priv_str = string.match(param, "([^ ]+) (.+)") if not revoke_name or not revoke_priv_str then return false, "Invalid parameters (see /help revoke)" - elseif not core.auth_table[revoke_name] then + elseif not core.get_auth_handler().get_auth(revoke_name) then return false, "Player " .. revoke_name .. " does not exist." end local revoke_privs = core.string_to_privs(revoke_priv_str) From 52ba1f867e5edb579a59a44fbb8286d4f1e54931 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sun, 1 Jan 2017 16:13:01 +0100 Subject: [PATCH 017/586] Breath cheat fix: server side Breath is now handled server side. Changing this behaviour required some modifications to core: * Ignore TOSERVER_BREATH package, marking it as obsolete * Clients doesn't send the breath to server anymore * Use PlayerSAO pointer instead of peer_id in Server::SendPlayerBreath to prevent a useless lookup (little perf gain) * drop a useless static_cast in emergePlayer --- src/client.cpp | 11 ++-- src/content_sao.cpp | 39 ++++++++++++-- src/content_sao.h | 7 ++- src/environment.cpp | 84 ++++++++++++++--------------- src/network/clientopcodes.cpp | 2 +- src/network/networkprotocol.h | 6 ++- src/network/serveropcodes.cpp | 2 +- src/network/serverpackethandler.cpp | 40 -------------- src/remoteplayer.cpp | 2 +- src/script/lua_api/l_object.cpp | 5 -- src/server.cpp | 15 +++--- src/server.h | 3 +- src/unittest/test_player.cpp | 4 +- 13 files changed, 107 insertions(+), 113 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 5476aad0e..1446ebad8 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -499,9 +499,10 @@ void Client::step(float dtime) m_client_event_queue.push(event); } } - else if(event.type == CEE_PLAYER_BREATH) { - u16 breath = event.player_breath.amount; - sendBreath(breath); + // Protocol v29 or greater obsoleted this event + else if (event.type == CEE_PLAYER_BREATH && m_proto_ver < 29) { + u16 breath = event.player_breath.amount; + sendBreath(breath); } } @@ -1270,6 +1271,10 @@ void Client::sendBreath(u16 breath) { DSTACK(FUNCTION_NAME); + // Protocol v29 make this obsolete + if (m_proto_ver >= 29) + return; + NetworkPacket pkt(TOSERVER_BREATH, sizeof(u16)); pkt << breath; Send(&pkt); diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 77ab51a02..f866d4372 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serialization.h" // For compressZlib #include "tool.h" // For ToolCapabilities #include "gamedef.h" +#include "nodedef.h" #include "remoteplayer.h" #include "server.h" #include "scripting_game.h" @@ -940,8 +941,35 @@ bool PlayerSAO::isAttached() void PlayerSAO::step(float dtime, bool send_recommended) { - if(!m_properties_sent) - { + if (m_drowning_interval.step(dtime, 2.0)) { + // get head position + v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_env->getMap().getNodeNoEx(p); + const ContentFeatures &c = ((Server*) m_env->getGameDef())->ndef()->get(n); + // If node generates drown + if (c.drowning > 0) { + if (m_hp > 0 && m_breath > 0) + setBreath(m_breath - 1); + + // No more breath, damage player + if (m_breath == 0) { + setHP(m_hp - c.drowning); + ((Server*) m_env->getGameDef())->SendPlayerHPOrDie(this); + } + } + } + + if (m_breathing_interval.step(dtime, 0.5)) { + // get head position + v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_env->getMap().getNodeNoEx(p); + const ContentFeatures &c = ((Server*) m_env->getGameDef())->ndef()->get(n); + // If player is alive & no drowning, breath + if (m_hp > 0 && c.drowning == 0) + setBreath(m_breath + 1); + } + + if (!m_properties_sent) { m_properties_sent = true; std::string str = getPropertyPacket(); // create message and add to list @@ -1237,12 +1265,15 @@ void PlayerSAO::setHP(s16 hp) m_properties_sent = false; } -void PlayerSAO::setBreath(const u16 breath) +void PlayerSAO::setBreath(const u16 breath, bool send) { if (m_player && breath != m_breath) m_player->setDirty(true); - m_breath = breath; + m_breath = MYMIN(breath, PLAYER_MAX_BREATH); + + if (send) + ((Server *) m_env->getGameDef())->SendPlayerBreath(this); } void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups) diff --git a/src/content_sao.h b/src/content_sao.h index 86255183d..9c66068b3 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef CONTENT_SAO_HEADER #define CONTENT_SAO_HEADER +#include #include "serverobject.h" #include "itemgroup.h" #include "object_properties.h" @@ -232,7 +233,7 @@ public: void setHPRaw(s16 hp) { m_hp = hp; } s16 readDamage(); u16 getBreath() const { return m_breath; } - void setBreath(const u16 breath); + void setBreath(const u16 breath, bool send = true); void setArmorGroups(const ItemGroupList &armor_groups); ItemGroupList getArmorGroups(); void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); @@ -339,6 +340,10 @@ private: v3s16 m_nocheat_dig_pos; float m_nocheat_dig_time; + // Timers + IntervalLimiter m_breathing_interval; + IntervalLimiter m_drowning_interval; + int m_wield_index; bool m_position_not_sent; ItemGroupList m_armor_groups; diff --git a/src/environment.cpp b/src/environment.cpp index 707d89659..ac9b5b079 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -2511,52 +2511,52 @@ void ClientEnvironment::step(float dtime) } } - /* - Drowning - */ - if(m_drowning_interval.step(dtime, 2.0)) - { - v3f pf = lplayer->getPosition(); + // Protocol v29 make this behaviour obsolete + if (((Client*) getGameDef())->getProtoVersion() < 29) { + /* + Drowning + */ + if (m_drowning_interval.step(dtime, 2.0)) { + v3f pf = lplayer->getPosition(); - // head - v3s16 p = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - u8 drowning_damage = c.drowning; - if(drowning_damage > 0 && lplayer->hp > 0){ - u16 breath = lplayer->getBreath(); - if(breath > 10){ - breath = 11; - } - if(breath > 0){ - breath -= 1; - } - lplayer->setBreath(breath); - updateLocalPlayerBreath(breath); - } - - if(lplayer->getBreath() == 0 && drowning_damage > 0){ - damageLocalPlayer(drowning_damage, true); - } - } - if(m_breathing_interval.step(dtime, 0.5)) - { - v3f pf = lplayer->getPosition(); - - // head - v3s16 p = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - if (!lplayer->hp){ - lplayer->setBreath(11); - } - else if(c.drowning == 0){ - u16 breath = lplayer->getBreath(); - if(breath <= 10){ - breath += 1; + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_gamedef->ndef()->get(n); + u8 drowning_damage = c.drowning; + if (drowning_damage > 0 && lplayer->hp > 0) { + u16 breath = lplayer->getBreath(); + if (breath > 10) { + breath = 11; + } + if (breath > 0) { + breath -= 1; + } lplayer->setBreath(breath); updateLocalPlayerBreath(breath); } + + if (lplayer->getBreath() == 0 && drowning_damage > 0) { + damageLocalPlayer(drowning_damage, true); + } + } + if (m_breathing_interval.step(dtime, 0.5)) { + v3f pf = lplayer->getPosition(); + + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_gamedef->ndef()->get(n); + if (!lplayer->hp) { + lplayer->setBreath(11); + } else if (c.drowning == 0) { + u16 breath = lplayer->getBreath(); + if (breath <= 10) { + breath += 1; + lplayer->setBreath(breath); + updateLocalPlayerBreath(breath); + } + } } } diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp index 3364de8c5..6defdcf1b 100644 --- a/src/network/clientopcodes.cpp +++ b/src/network/clientopcodes.cpp @@ -193,7 +193,7 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] = null_command_factory, // 0x3f { "TOSERVER_REQUEST_MEDIA", 1, true }, // 0x40 { "TOSERVER_RECEIVED_MEDIA", 1, true }, // 0x41 - { "TOSERVER_BREATH", 0, true }, // 0x42 + null_command_factory, // 0x42 old TOSERVER_BREATH. Ignored by servers { "TOSERVER_CLIENT_READY", 0, true }, // 0x43 null_command_factory, // 0x44 null_command_factory, // 0x45 diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 018b392b6..f65167380 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -138,9 +138,11 @@ with this program; if not, write to the Free Software Foundation, Inc., Add nodedef v3 - connected nodeboxes PROTOCOL_VERSION 28: CPT2_MESHOPTIONS + PROTOCOL_VERSION 29: + Server doesn't accept TOSERVER_BREATH anymore */ -#define LATEST_PROTOCOL_VERSION 28 +#define LATEST_PROTOCOL_VERSION 29 // Server's supported network protocol range #define SERVER_PROTOCOL_VERSION_MIN 13 @@ -833,7 +835,7 @@ enum ToServerCommand */ - TOSERVER_BREATH = 0x42, + TOSERVER_BREATH = 0x42, // Obsolete /* u16 breath */ diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp index 9b14a1be3..642dd376a 100644 --- a/src/network/serveropcodes.cpp +++ b/src/network/serveropcodes.cpp @@ -90,7 +90,7 @@ const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] = null_command_handler, // 0x3f { "TOSERVER_REQUEST_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_RequestMedia }, // 0x40 { "TOSERVER_RECEIVED_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_ReceivedMedia }, // 0x41 - { "TOSERVER_BREATH", TOSERVER_STATE_INGAME, &Server::handleCommand_Breath }, // 0x42 + { "TOSERVER_BREATH", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x42 Old breath model which is now deprecated for anticheating { "TOSERVER_CLIENT_READY", TOSERVER_STATE_STARTUP, &Server::handleCommand_ClientReady }, // 0x43 null_command_handler, // 0x44 null_command_handler, // 0x45 diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index d0f4d948d..eeabcca71 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1136,46 +1136,6 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) } } -void Server::handleCommand_Breath(NetworkPacket* pkt) -{ - u16 breath; - - *pkt >> breath; - - RemotePlayer *player = m_env->getPlayer(pkt->getPeerId()); - - if (player == NULL) { - errorstream << "Server::ProcessData(): Canceling: " - "No player for peer_id=" << pkt->getPeerId() - << " disconnecting peer!" << std::endl; - m_con.DisconnectPeer(pkt->getPeerId()); - return; - } - - - PlayerSAO *playersao = player->getPlayerSAO(); - if (playersao == NULL) { - errorstream << "Server::ProcessData(): Canceling: " - "No player object for peer_id=" << pkt->getPeerId() - << " disconnecting peer!" << std::endl; - m_con.DisconnectPeer(pkt->getPeerId()); - return; - } - - /* - * If player is dead, we don't need to update the breath - * He is dead ! - */ - if (playersao->isDead()) { - verbosestream << "TOSERVER_BREATH: " << player->getName() - << " is dead. Ignoring packet"; - return; - } - - playersao->setBreath(breath); - SendPlayerBreath(pkt->getPeerId()); -} - void Server::handleCommand_Password(NetworkPacket* pkt) { if (pkt->getSize() != PASSWORD_SIZE * 2) diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index 67ab89113..18bfa1030 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -148,7 +148,7 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, } catch (SettingNotFoundException &e) {} try { - sao->setBreath(args.getS32("breath")); + sao->setBreath(args.getS32("breath"), false); } catch (SettingNotFoundException &e) {} } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 2a8b8a64e..cfdceb28e 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1152,13 +1152,8 @@ int ObjectRef::l_set_breath(lua_State *L) PlayerSAO* co = getplayersao(ref); if (co == NULL) return 0; u16 breath = luaL_checknumber(L, 2); - // Do it co->setBreath(breath); - // If the object is a player sent the breath to client - if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) - getServer(L)->SendPlayerBreath(((PlayerSAO*)co)->getPeerID()); - return 0; } diff --git a/src/server.cpp b/src/server.cpp index fa7a838d4..60dbef0d2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1076,8 +1076,7 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id) } m_clients.unlock(); - RemotePlayer *player = - static_cast(m_env->getPlayer(playername.c_str())); + RemotePlayer *player = m_env->getPlayer(playername.c_str()); // If failed, cancel if ((playersao == NULL) || (player == NULL)) { @@ -1113,7 +1112,7 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id) SendPlayerHPOrDie(playersao); // Send Breath - SendPlayerBreath(peer_id); + SendPlayerBreath(playersao); // Show death screen if necessary if (playersao->isDead()) @@ -1857,14 +1856,13 @@ void Server::SendPlayerHP(u16 peer_id) playersao->m_messages_out.push(aom); } -void Server::SendPlayerBreath(u16 peer_id) +void Server::SendPlayerBreath(PlayerSAO *sao) { DSTACK(FUNCTION_NAME); - PlayerSAO *playersao = getPlayerSAO(peer_id); - assert(playersao); + assert(sao); - m_script->player_event(playersao, "breath_changed"); - SendBreath(peer_id, playersao->getBreath()); + m_script->player_event(sao, "breath_changed"); + SendBreath(sao->getPeerID(), sao->getBreath()); } void Server::SendMovePlayer(u16 peer_id) @@ -2565,7 +2563,6 @@ void Server::RespawnPlayer(u16 peer_id) } SendPlayerHP(peer_id); - SendPlayerBreath(peer_id); } diff --git a/src/server.h b/src/server.h index cab7e2445..f0df0f9ec 100644 --- a/src/server.h +++ b/src/server.h @@ -180,7 +180,6 @@ public: void handleCommand_InventoryAction(NetworkPacket* pkt); void handleCommand_ChatMessage(NetworkPacket* pkt); void handleCommand_Damage(NetworkPacket* pkt); - void handleCommand_Breath(NetworkPacket* pkt); void handleCommand_Password(NetworkPacket* pkt); void handleCommand_PlayerItem(NetworkPacket* pkt); void handleCommand_Respawn(NetworkPacket* pkt); @@ -358,7 +357,7 @@ public: void printToConsoleOnly(const std::string &text); void SendPlayerHPOrDie(PlayerSAO *player); - void SendPlayerBreath(u16 peer_id); + void SendPlayerBreath(PlayerSAO *sao); void SendInventory(PlayerSAO* playerSAO); void SendMovePlayer(u16 peer_id); diff --git a/src/unittest/test_player.cpp b/src/unittest/test_player.cpp index 85fbc8b2d..655ee08fd 100644 --- a/src/unittest/test_player.cpp +++ b/src/unittest/test_player.cpp @@ -49,7 +49,7 @@ void TestPlayer::testSave(IGameDef *gamedef) PlayerSAO sao(NULL, 1, false); sao.initialize(&rplayer, std::set()); rplayer.setPlayerSAO(&sao); - sao.setBreath(10); + sao.setBreath(10, false); sao.setHPRaw(8); sao.setYaw(0.1f); sao.setPitch(0.6f); @@ -64,7 +64,7 @@ void TestPlayer::testLoad(IGameDef *gamedef) PlayerSAO sao(NULL, 1, false); sao.initialize(&rplayer, std::set()); rplayer.setPlayerSAO(&sao); - sao.setBreath(10); + sao.setBreath(10, false); sao.setHPRaw(8); sao.setYaw(0.1f); sao.setPitch(0.6f); From e2e8da5ee44f71c22996a780caff67e48e79fae4 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sun, 1 Jan 2017 23:57:37 +0100 Subject: [PATCH 018/586] Fix non reverted change on TOSERVER_BREATH compat --- src/network/clientopcodes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp index 6defdcf1b..cee402acd 100644 --- a/src/network/clientopcodes.cpp +++ b/src/network/clientopcodes.cpp @@ -193,7 +193,7 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] = null_command_factory, // 0x3f { "TOSERVER_REQUEST_MEDIA", 1, true }, // 0x40 { "TOSERVER_RECEIVED_MEDIA", 1, true }, // 0x41 - null_command_factory, // 0x42 old TOSERVER_BREATH. Ignored by servers + { "TOSERVER_BREATH", 0, true }, // 0x42 old TOSERVER_BREATH. Ignored by servers { "TOSERVER_CLIENT_READY", 0, true }, // 0x43 null_command_factory, // 0x44 null_command_factory, // 0x45 From 523f0e8c5bce0cb58215dc1f9d027cf32394e3c3 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Fri, 23 Dec 2016 13:48:32 +0100 Subject: [PATCH 019/586] Move TileAnimation code to seperate file --- src/CMakeLists.txt | 1 + src/client/tile.h | 4 +- src/mapblock_mesh.cpp | 3 +- src/network/networkprotocol.h | 2 + src/nodedef.cpp | 35 ++++++------- src/nodedef.h | 16 ++---- src/particles.cpp | 13 ++--- src/script/common/c_content.cpp | 6 +-- src/tileanimation.cpp | 87 +++++++++++++++++++++++++++++++++ src/tileanimation.h | 49 +++++++++++++++++++ 10 files changed, 168 insertions(+), 48 deletions(-) create mode 100644 src/tileanimation.cpp create mode 100644 src/tileanimation.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3aa645df9..51cf88063 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -459,6 +459,7 @@ set(common_SRCS staticobject.cpp subgame.cpp terminal_chat_console.cpp + tileanimation.cpp tool.cpp treegen.cpp version.cpp diff --git a/src/client/tile.h b/src/client/tile.h index b75916841..452804801 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -161,9 +161,7 @@ enum MaterialType{ // Should the crack be drawn on transparent pixels (unset) or not (set)? // Ignored if MATERIAL_FLAG_CRACK is not set. #define MATERIAL_FLAG_CRACK_OVERLAY 0x04 -// Animation made up by splitting the texture to vertical frames, as -// defined by extra parameters -#define MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES 0x08 +#define MATERIAL_FLAG_ANIMATION 0x08 #define MATERIAL_FLAG_HIGHLIGHTED 0x10 #define MATERIAL_FLAG_TILEABLE_HORIZONTAL 0x20 #define MATERIAL_FLAG_TILEABLE_VERTICAL 0x40 diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 00f83e7ab..977eabb6e 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -1131,8 +1131,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): &p.tile.texture_id); } // - Texture animation - if(p.tile.material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - { + if (p.tile.material_flags & MATERIAL_FLAG_ANIMATION) { // Add to MapBlockMesh in order to animate these tiles m_animation_tiles[i] = p.tile; m_animation_frames[i] = 0; diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index f65167380..45bf76ff8 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -140,6 +140,8 @@ with this program; if not, write to the Free Software Foundation, Inc., CPT2_MESHOPTIONS PROTOCOL_VERSION 29: Server doesn't accept TOSERVER_BREATH anymore + serialization of TileAnimation params changed + TAT_SHEET_2D */ #define LATEST_PROTOCOL_VERSION 29 diff --git a/src/nodedef.cpp b/src/nodedef.cpp index ccbb42c66..21bceb94d 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -188,17 +188,16 @@ void NodeBox::deSerialize(std::istream &is) void TileDef::serialize(std::ostream &os, u16 protocol_version) const { - if (protocol_version >= 26) + if (protocol_version >= 29) + writeU8(os, 3); + else if (protocol_version >= 26) writeU8(os, 2); else if (protocol_version >= 17) writeU8(os, 1); else writeU8(os, 0); os<= 17) writeU8(os, backface_culling); if (protocol_version >= 26) { @@ -211,10 +210,7 @@ void TileDef::deSerialize(std::istream &is, const u8 contenfeatures_version, con { int version = readU8(is); name = deSerializeString(is); - animation.type = (TileAnimationType)readU8(is); - animation.aspect_w = readU16(is); - animation.aspect_h = readU16(is); - animation.length = readF1000(is); + animation.deSerialize(is, version >= 3 ? 29 : 26); if (version >= 1) backface_culling = readU8(is); if (version >= 2) { @@ -533,7 +529,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, if (backface_culling) tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; if (tiledef->animation.type == TAT_VERTICAL_FRAMES) - tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + tile->material_flags |= MATERIAL_FLAG_ANIMATION; if (tiledef->tileable_horizontal) tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL; if (tiledef->tileable_vertical) @@ -541,20 +537,16 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, // Animation parameters int frame_count = 1; - if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { - // Get texture size to determine frame count by aspect ratio - v2u32 size = tile->texture->getOriginalSize(); - int frame_height = (float)size.X / - (float)tiledef->animation.aspect_w * - (float)tiledef->animation.aspect_h; - frame_count = size.Y / frame_height; - int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count; + if (tile->material_flags & MATERIAL_FLAG_ANIMATION) { + int frame_length_ms; + tiledef->animation.determineParams(tile->texture->getOriginalSize(), + &frame_count, &frame_length_ms); tile->animation_frame_count = frame_count; tile->animation_frame_length_ms = frame_length_ms; } if (frame_count == 1) { - tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + tile->material_flags &= ~MATERIAL_FLAG_ANIMATION; } else { std::ostringstream os(std::ios::binary); tile->frames.resize(frame_count); @@ -564,8 +556,9 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, FrameSpec frame; os.str(""); - os << tiledef->name << "^[verticalframe:" - << frame_count << ":" << i; + os << tiledef->name; + tiledef->animation.getTextureModifer(os, + tile->texture->getOriginalSize(), i); frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id); if (tile->normal_texture) diff --git a/src/nodedef.h b/src/nodedef.h index 80396f992..b5639b516 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemgroup.h" #include "sound.h" // SimpleSoundSpec #include "constants.h" // BS +#include "tileanimation.h" class INodeDefManager; class IItemDefManager; @@ -161,22 +162,14 @@ enum NodeDrawType /* Stand-alone definition of a TileSpec (basically a server-side TileSpec) */ -enum TileAnimationType{ - TAT_NONE=0, - TAT_VERTICAL_FRAMES=1, -}; + struct TileDef { std::string name; bool backface_culling; // Takes effect only in special cases bool tileable_horizontal; bool tileable_vertical; - struct{ - enum TileAnimationType type; - int aspect_w; // width for aspect ratio - int aspect_h; // height for aspect ratio - float length; // seconds - } animation; + struct TileAnimationParams animation; TileDef() { @@ -185,9 +178,6 @@ struct TileDef tileable_horizontal = true; tileable_vertical = true; animation.type = TAT_NONE; - animation.aspect_w = 1; - animation.aspect_h = 1; - animation.length = 1.0; } void serialize(std::ostream &os, u16 protocol_version) const; diff --git a/src/particles.cpp b/src/particles.cpp index acf9cc815..e9ddba986 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -567,19 +567,20 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s { // Texture u8 texid = myrand_range(0, 5); - video::ITexture *texture = tiles[texid].texture; + video::ITexture *texture; // Only use first frame of animated texture - f32 ymax = 1; - if(tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - ymax /= tiles[texid].animation_frame_count; + if(tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION) + texture = tiles[texid].frames[0].texture; + else + texture = tiles[texid].texture; float size = rand() % 64 / 512.; float visual_size = BS * size; - v2f texsize(size * 2, ymax * size * 2); + v2f texsize(size * 2, size * 2); v2f texpos; texpos.X = ((rand() % 64) / 64. - texsize.X); - texpos.Y = ymax * ((rand() % 64) / 64. - texsize.Y); + texpos.Y = ((rand() % 64) / 64. - texsize.Y); // Physics v3f velocity((rand() % 100 / 50. - 1) / 1.5, diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 541744895..6cd1d040b 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -338,11 +338,11 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) tiledef.animation.type = (TileAnimationType) getenumfield(L, -1, "type", es_TileAnimationType, TAT_NONE); - tiledef.animation.aspect_w = + tiledef.animation.vertical_frames.aspect_w = getintfield_default(L, -1, "aspect_w", 16); - tiledef.animation.aspect_h = + tiledef.animation.vertical_frames.aspect_h = getintfield_default(L, -1, "aspect_h", 16); - tiledef.animation.length = + tiledef.animation.vertical_frames.length = getfloatfield_default(L, -1, "length", 1.0); } lua_pop(L, 1); diff --git a/src/tileanimation.cpp b/src/tileanimation.cpp new file mode 100644 index 000000000..891478c9f --- /dev/null +++ b/src/tileanimation.cpp @@ -0,0 +1,87 @@ +/* +Minetest +Copyright (C) 2016 sfan5 + +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 "tileanimation.h" +#include "util/serialize.h" + +void TileAnimationParams::serialize(std::ostream &os, u16 protocol_version) const +{ + if(protocol_version < 29 /* TODO bump */) { + if (type == TAT_VERTICAL_FRAMES) { + writeU8(os, type); + writeU16(os, vertical_frames.aspect_w); + writeU16(os, vertical_frames.aspect_h); + writeF1000(os, vertical_frames.length); + } else { + writeU8(os, TAT_NONE); + writeU16(os, 1); + writeU16(os, 1); + writeF1000(os, 1.0); + } + return; + } + + writeU8(os, type); + if (type == TAT_VERTICAL_FRAMES) { + writeU16(os, vertical_frames.aspect_w); + writeU16(os, vertical_frames.aspect_h); + writeF1000(os, vertical_frames.length); + } +} + +void TileAnimationParams::deSerialize(std::istream &is, u16 protocol_version) +{ + type = (TileAnimationType) readU8(is); + if(protocol_version < 29 /* TODO bump */) { + vertical_frames.aspect_w = readU16(is); + vertical_frames.aspect_h = readU16(is); + vertical_frames.length = readF1000(is); + return; + } + + if(type == TAT_VERTICAL_FRAMES) { + vertical_frames.aspect_w = readU16(is); + vertical_frames.aspect_h = readU16(is); + vertical_frames.length = readF1000(is); + } +} + +void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms) const +{ + if (type == TAT_NONE) { + *frame_count = 1; + *frame_length_ms = 1000; + return; + } + int frame_height = (float)texture_size.X / + (float)vertical_frames.aspect_w * + (float)vertical_frames.aspect_h; + if (frame_count) + *frame_count = texture_size.Y / frame_height; + if (frame_length_ms) + *frame_length_ms = 1000.0 * vertical_frames.length / (texture_size.Y / frame_height); +} + +void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const +{ + if (type == TAT_NONE) + return; + int frame_count; + determineParams(texture_size, &frame_count, NULL); + os << "^[verticalframe:" << frame_count << ":" << frame; +} diff --git a/src/tileanimation.h b/src/tileanimation.h new file mode 100644 index 000000000..d5172ed50 --- /dev/null +++ b/src/tileanimation.h @@ -0,0 +1,49 @@ +/* +Minetest +Copyright (C) 2016 sfan5 + +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 TILEANIMATION_HEADER +#define TILEANIMATION_HEADER + +#include "irrlichttypes_bloated.h" +#include + +enum TileAnimationType { + TAT_NONE = 0, + TAT_VERTICAL_FRAMES = 1, +}; + +struct TileAnimationParams { + enum TileAnimationType type; + union { + // struct { + // } none; + struct { + int aspect_w; // width for aspect ratio + int aspect_h; // height for aspect ratio + float length; // seconds + } vertical_frames; + }; + + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is, u16 protocol_version); + void determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms) const; + void getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const; +}; + +#endif From 7057c196c442ff3484b53f48d940f4c9e0ffe23a Mon Sep 17 00:00:00 2001 From: Luke Puchner-Hardman Date: Tue, 23 Sep 2014 14:39:34 +0200 Subject: [PATCH 020/586] Added "[sheet" to the texture special commands. "[sheet:WxH:X,Y" assumes the base image is a tilesheet with W*H tiles on it and crops to the tile at position X,Y. Basically it works like "[verticalframe" but in 2D. For testing, I combined the four default_chest images into one. --- doc/lua_api.txt | 5 ++ games/minimal/mods/default/init.lua | 10 ++-- .../mods/default/textures/default_chest.png | Bin 0 -> 263 bytes .../default/textures/default_chest_front.png | Bin 114 -> 0 bytes .../default/textures/default_chest_lock.png | Bin 145 -> 0 bytes .../default/textures/default_chest_side.png | Bin 98 -> 0 bytes .../default/textures/default_chest_top.png | Bin 93 -> 0 bytes src/client/tile.cpp | 43 ++++++++++++++++++ 8 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 games/minimal/mods/default/textures/default_chest.png delete mode 100644 games/minimal/mods/default/textures/default_chest_front.png delete mode 100644 games/minimal/mods/default/textures/default_chest_lock.png delete mode 100644 games/minimal/mods/default/textures/default_chest_side.png delete mode 100644 games/minimal/mods/default/textures/default_chest_top.png diff --git a/doc/lua_api.txt b/doc/lua_api.txt index d2ddc635b..648a29303 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -403,6 +403,11 @@ Apply a mask to the base image. The mask is applied using binary AND. +#### `[sheet:x:,` +Retrieves a tile at position x,y from the base image +which it assumes to be a tilesheet with dimensions w,h. + + #### `[colorize::` Colorize the textures with the given color. `` is specified as a `ColorString`. diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua index bff7860e3..f532e7193 100644 --- a/games/minimal/mods/default/init.lua +++ b/games/minimal/mods/default/init.lua @@ -1130,8 +1130,9 @@ minetest.register_node("default:sign_wall", { minetest.register_node("default:chest", { description = "Chest", - tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:0,1"}, paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, @@ -1164,8 +1165,9 @@ end minetest.register_node("default:chest_locked", { description = "Locked Chest", - tiles ={"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", - "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0", + "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,1"}, paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, diff --git a/games/minimal/mods/default/textures/default_chest.png b/games/minimal/mods/default/textures/default_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..9746a3fd9396e8d318be2674deeee14427c74586 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WI14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sfJx+0MH8sl}#uI=-%RF5iLp+Wr=VT--&`d~7NJy}7*iyvK7If9v(BQ&B_9aa0 zLRa|wFMba zSA!3-H#G@glyEu1xNgHSExC@}s|pSTK9tE&(0#fuX6DHQ2M!2WO!P99O4CR*o;B;| zgWIj4Tedb#oIAZuY)}0B^DAF+CSK6u+aP5dCC@YM7X!nQk18x*_VhLZUCiL=>gTe~ HDWM4fnuc4; literal 0 HcmV?d00001 diff --git a/games/minimal/mods/default/textures/default_chest_front.png b/games/minimal/mods/default/textures/default_chest_front.png deleted file mode 100644 index 55b076c354b3b6d8f067cb2477b7bf9dd36ba311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-t_=;4sMJL+simpp4*2T0TnZNy85}S Ib4q9e05}sF)c^nh diff --git a/games/minimal/mods/default/textures/default_chest_lock.png b/games/minimal/mods/default/textures/default_chest_lock.png deleted file mode 100644 index 4b2d1af6c5e4e09eb439cf27d2b67eb21f3153e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZZE#>{XaJ&y_C)KB43CKu zCr+O}-TkWjL!bh4PZ!4!j_7287A7`EHiHBggN8*(T?(2Ce8H`&I6*j})yTPO^XohVL-Tt9+3RX4uYs}*p00i_>zopr0AVo~%>V!Z diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 7f7535df6..4d2166342 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1827,6 +1827,49 @@ bool TextureSource::generateImagePart(std::string part_of_name, baseimg->setPixel(x, y, c); } } + /* + [sheet:WxH:X,Y + Retrieves a tile at position X,Y (in tiles) + from the base image it assumes to be a + tilesheet with dimensions W,H (in tiles). + */ + else if (part_of_name.substr(0,7) == "[sheet:") { + if (baseimg == NULL) { + errorstream << "generateImagePart(): baseimg != NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + Strfnd sf(part_of_name); + sf.next(":"); + u32 w0 = stoi(sf.next("x")); + u32 h0 = stoi(sf.next(":")); + u32 x0 = stoi(sf.next(",")); + u32 y0 = stoi(sf.next(":")); + + core::dimension2d img_dim = baseimg->getDimension(); + core::dimension2d tile_dim(v2u32(img_dim) / v2u32(w0, h0)); + + video::IImage *img = driver->createImage( + video::ECF_A8R8G8B8, tile_dim); + if (!img) { + errorstream << "generateImagePart(): Could not create image " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + img->fill(video::SColor(0,0,0,0)); + v2u32 vdim(tile_dim); + core::rect rect(v2s32(x0 * vdim.X, y0 * vdim.Y), tile_dim); + baseimg->copyToWithAlpha(img, v2s32(0), rect, + video::SColor(255,255,255,255), NULL); + + // Replace baseimg + baseimg->drop(); + baseimg = img; + } else { errorstream << "generateImagePart(): Invalid " From a07b032245bef76a7695e139a9daca7cb646a73d Mon Sep 17 00:00:00 2001 From: sfan5 Date: Fri, 23 Dec 2016 14:43:56 +0100 Subject: [PATCH 021/586] Add 2D sheet animation for nodes --- doc/lua_api.txt | 21 ++++++- games/minimal/mods/default/init.lua | 7 ++- .../textures/default_lava_source_animated.png | Bin 2902 -> 3145 bytes src/nodedef.cpp | 2 +- src/particles.cpp | 2 +- src/script/common/c_content.cpp | 25 ++++++--- src/tileanimation.cpp | 52 +++++++++++++----- src/tileanimation.h | 6 ++ 8 files changed, 88 insertions(+), 27 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 648a29303..6166826af 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3702,7 +3702,26 @@ Definition tables * `image` (name) ### Tile animation definition -* `{type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}` + + { + type = "vertical_frames", + aspect_w = 16, + -- ^ specify width of a frame in pixels + aspect_h = 16, + -- ^ specify height of a frame in pixels + length = 3.0, + -- ^ specify full loop length + } + + { + type = "sheet_2d", + frames_w = 5, + -- ^ specify width in number of frames + frames_h = 3, + -- ^ specify height in number of frames + frame_length = 0.5, + -- ^ specify length of a single frame + } ### Node definition (`register_node`) diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua index f532e7193..2f73b53ef 100644 --- a/games/minimal/mods/default/init.lua +++ b/games/minimal/mods/default/init.lua @@ -1044,8 +1044,11 @@ minetest.register_node("default:lava_source", { inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "liquid", --tiles ={"default_lava.png"}, - tiles ={ - {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + tiles = { + { + name = "default_lava_source_animated.png", + animation = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} + } }, special_tiles = { -- New-style lava source material (mostly unused) diff --git a/games/minimal/mods/default/textures/default_lava_source_animated.png b/games/minimal/mods/default/textures/default_lava_source_animated.png index aa9d57cf17d0be0dddfbb0cfe0aae10e362dac94..54f4c0ddda45bcc1bcf5b9c2aed872c64b3328f7 100644 GIT binary patch literal 3145 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 AlmGw# diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 21bceb94d..92cdf738e 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -528,7 +528,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, tile->material_flags = 0; if (backface_culling) tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; - if (tiledef->animation.type == TAT_VERTICAL_FRAMES) + if (tiledef->animation.type != TAT_NONE) tile->material_flags |= MATERIAL_FLAG_ANIMATION; if (tiledef->tileable_horizontal) tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL; diff --git a/src/particles.cpp b/src/particles.cpp index e9ddba986..97f42e2c4 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -570,7 +570,7 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s video::ITexture *texture; // Only use first frame of animated texture - if(tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION) + if (tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION) texture = tiles[texid].frames[0].texture; else texture = tiles[texid].texture; diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 6cd1d040b..b9bcfef69 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -39,6 +39,7 @@ struct EnumString es_TileAnimationType[] = { {TAT_NONE, "none"}, {TAT_VERTICAL_FRAMES, "vertical_frames"}, + {TAT_SHEET_2D, "sheet_2d"}, {0, NULL}, }; @@ -334,16 +335,26 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) // animation = {} lua_getfield(L, index, "animation"); if(lua_istable(L, -1)){ - // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} tiledef.animation.type = (TileAnimationType) getenumfield(L, -1, "type", es_TileAnimationType, TAT_NONE); - tiledef.animation.vertical_frames.aspect_w = - getintfield_default(L, -1, "aspect_w", 16); - tiledef.animation.vertical_frames.aspect_h = - getintfield_default(L, -1, "aspect_h", 16); - tiledef.animation.vertical_frames.length = - getfloatfield_default(L, -1, "length", 1.0); + if (tiledef.animation.type == TAT_VERTICAL_FRAMES) { + // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} + tiledef.animation.vertical_frames.aspect_w = + getintfield_default(L, -1, "aspect_w", 16); + tiledef.animation.vertical_frames.aspect_h = + getintfield_default(L, -1, "aspect_h", 16); + tiledef.animation.vertical_frames.length = + getfloatfield_default(L, -1, "length", 1.0); + } else if (tiledef.animation.type == TAT_SHEET_2D) { + // {type="sheet_2d", frames_w=5, frames_h=3, frame_length=0.5} + getintfield(L, -1, "frames_w", + tiledef.animation.sheet_2d.frames_w); + getintfield(L, -1, "frames_h", + tiledef.animation.sheet_2d.frames_h); + getfloatfield(L, -1, "frame_length", + tiledef.animation.sheet_2d.frame_length); + } } lua_pop(L, 1); } diff --git a/src/tileanimation.cpp b/src/tileanimation.cpp index 891478c9f..a23eecc2e 100644 --- a/src/tileanimation.cpp +++ b/src/tileanimation.cpp @@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., void TileAnimationParams::serialize(std::ostream &os, u16 protocol_version) const { - if(protocol_version < 29 /* TODO bump */) { + if (protocol_version < 29) { if (type == TAT_VERTICAL_FRAMES) { writeU8(os, type); writeU16(os, vertical_frames.aspect_w); @@ -41,47 +41,69 @@ void TileAnimationParams::serialize(std::ostream &os, u16 protocol_version) cons writeU16(os, vertical_frames.aspect_w); writeU16(os, vertical_frames.aspect_h); writeF1000(os, vertical_frames.length); + } else if (type == TAT_SHEET_2D) { + writeU8(os, sheet_2d.frames_w); + writeU8(os, sheet_2d.frames_h); + writeF1000(os, sheet_2d.frame_length); } } void TileAnimationParams::deSerialize(std::istream &is, u16 protocol_version) { type = (TileAnimationType) readU8(is); - if(protocol_version < 29 /* TODO bump */) { + if (protocol_version < 29) { vertical_frames.aspect_w = readU16(is); vertical_frames.aspect_h = readU16(is); vertical_frames.length = readF1000(is); return; } - if(type == TAT_VERTICAL_FRAMES) { + if (type == TAT_VERTICAL_FRAMES) { vertical_frames.aspect_w = readU16(is); vertical_frames.aspect_h = readU16(is); vertical_frames.length = readF1000(is); + } else if (type == TAT_SHEET_2D) { + sheet_2d.frames_w = readU8(is); + sheet_2d.frames_h = readU8(is); + sheet_2d.frame_length = readF1000(is); } } void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms) const { - if (type == TAT_NONE) { + if (type == TAT_VERTICAL_FRAMES) { + int frame_height = (float)texture_size.X / + (float)vertical_frames.aspect_w * + (float)vertical_frames.aspect_h; + int _frame_count = texture_size.Y / frame_height; + if (frame_count) + *frame_count = _frame_count; + if (frame_length_ms) + *frame_length_ms = 1000.0 * vertical_frames.length / _frame_count; + } else if (type == TAT_SHEET_2D) { + if (frame_count) + *frame_count = sheet_2d.frames_w * sheet_2d.frames_h; + if (frame_length_ms) + *frame_length_ms = 1000 * sheet_2d.frame_length; + } else { // TAT_NONE *frame_count = 1; *frame_length_ms = 1000; - return; } - int frame_height = (float)texture_size.X / - (float)vertical_frames.aspect_w * - (float)vertical_frames.aspect_h; - if (frame_count) - *frame_count = texture_size.Y / frame_height; - if (frame_length_ms) - *frame_length_ms = 1000.0 * vertical_frames.length / (texture_size.Y / frame_height); } void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const { if (type == TAT_NONE) return; - int frame_count; - determineParams(texture_size, &frame_count, NULL); - os << "^[verticalframe:" << frame_count << ":" << frame; + if (type == TAT_VERTICAL_FRAMES) { + int frame_count; + determineParams(texture_size, &frame_count, NULL); + os << "^[verticalframe:" << frame_count << ":" << frame; + } else if (type == TAT_SHEET_2D) { + int q, r; + q = frame / sheet_2d.frames_w; + r = frame % sheet_2d.frames_w; + os << "^[sheet:" << sheet_2d.frames_w << "x" << sheet_2d.frames_h + << ":" << r << "," << q; + } } diff --git a/src/tileanimation.h b/src/tileanimation.h index d5172ed50..289ce515b 100644 --- a/src/tileanimation.h +++ b/src/tileanimation.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., enum TileAnimationType { TAT_NONE = 0, TAT_VERTICAL_FRAMES = 1, + TAT_SHEET_2D = 2, }; struct TileAnimationParams { @@ -38,6 +39,11 @@ struct TileAnimationParams { int aspect_h; // height for aspect ratio float length; // seconds } vertical_frames; + struct { + int frames_w; // number of frames left-to-right + int frames_h; // number of frames top-to-bottom + float frame_length; // seconds + } sheet_2d; }; void serialize(std::ostream &os, u16 protocol_version) const; From 6718a95103b2a6c308da121a1340dfdcad2e069d Mon Sep 17 00:00:00 2001 From: Thomas--S Date: Mon, 2 Jan 2017 22:42:50 +0100 Subject: [PATCH 022/586] Fix display gamma documentation Overlooked in #4873 --- minetest.conf.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minetest.conf.example b/minetest.conf.example index 262f95115..bf70f5e51 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -505,7 +505,7 @@ # type: int min: 15 max: 160 # zoom_fov = 15 -# Adjust the gamma encoding for the light tables. Lower numbers are brighter. +# Adjust the gamma encoding for the light tables. Higher numbers are brighter. # This setting is for the client only and is ignored by the server. # type: float min: 1 max: 3 # display_gamma = 2.2 From 7387b190213996e453d0a7447027a71615034f5e Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Sat, 31 Dec 2016 12:40:31 -0800 Subject: [PATCH 023/586] Pull occlusion check out of loop, and minor code cleanups. --- src/clientmap.cpp | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 27f9dea38..7d76e6e8b 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -213,6 +213,16 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) // Distance to farthest drawn block float farthest_drawn = 0; + // No occlusion culling when free_move is on and camera is + // inside ground + bool occlusion_culling_enabled = true; + if (g_settings->getBool("free_move")) { + MapNode n = getNodeNoEx(cam_pos_nodes); + if (n.getContent() == CONTENT_IGNORE || + nodemgr->get(n).solidness == 2) + occlusion_culling_enabled = false; + } + for (std::map::iterator si = m_sectors.begin(); si != m_sectors.end(); ++si) { MapSector *sector = si->second; @@ -254,39 +264,19 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) camera_direction, camera_fov, range, &d)) continue; - // This is ugly (spherical distance limit?) - /*if(m_control.range_all == false && - d - 0.5*BS*MAP_BLOCKSIZE > range) - continue;*/ - blocks_in_range++; /* Ignore if mesh doesn't exist */ - { - //MutexAutoLock lock(block->mesh_mutex); - - if (block->mesh == NULL) { - blocks_in_range_without_mesh++; - continue; - } + if (block->mesh == NULL) { + blocks_in_range_without_mesh++; + continue; } /* Occlusion culling */ - - // No occlusion culling when free_move is on and camera is - // inside ground - bool occlusion_culling_enabled = true; - if (g_settings->getBool("free_move")) { - MapNode n = getNodeNoEx(cam_pos_nodes); - if (n.getContent() == CONTENT_IGNORE || - nodemgr->get(n).solidness == 2) - occlusion_culling_enabled = false; - } - v3s16 cpn = block->getPos() * MAP_BLOCKSIZE; cpn += v3s16(MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2, MAP_BLOCKSIZE / 2); float step = BS * 1; @@ -447,11 +437,6 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) Get all blocks and draw all visible ones */ - v3s16 cam_pos_nodes = floatToInt(camera_position, BS); - v3s16 p_blocks_min; - v3s16 p_blocks_max; - getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max); - u32 vertex_count = 0; u32 meshbuffer_count = 0; From 8aadc62856cc3789ed345ddf3870e311af60afe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Wed, 4 Jan 2017 14:36:51 +0100 Subject: [PATCH 024/586] Travis: Build server too for UNIX --- util/travis/script.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/util/travis/script.sh b/util/travis/script.sh index 1bafb26cd..24a74d186 100755 --- a/util/travis/script.sh +++ b/util/travis/script.sh @@ -21,6 +21,7 @@ if [[ $PLATFORM == "Unix" ]]; then cmake -DCMAKE_BUILD_TYPE=Debug \ -DRUN_IN_PLACE=TRUE \ -DENABLE_GETTEXT=TRUE \ + -DBUILD_SERVER=TRUE \ $CMAKE_FLAGS .. make -j2 echo "Running unit tests." From 3f8261830e0503cd59d8713d5c9aab12fc1491db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Wed, 4 Jan 2017 19:18:40 +0100 Subject: [PATCH 025/586] Improve getPointedThing() (#4346) * Improved getPointedThing() The new algorithm checks every node exactly once. Now the point and normal vector of the collision is also returned in the PointedThing (currently they are not used outside of the function). Now the CNodeDefManager keeps the union of all possible nodeboxes, so the raycast won't miss any nodes. Also if there are only small nodeboxes, getPointedThing() is exceptionally fast. Also adds unit test for VoxelLineIterator. * Cleanup, code move This commit moves getPointedThing() and Client::getSelectedActiveObject() to ClientEnvironment. The map nodes now can decide which neighbors they are connecting to (MapNode::getNeighbors()). --- src/CMakeLists.txt | 1 + src/client.cpp | 39 +-- src/client.h | 8 - src/clientmap.cpp | 33 +-- src/environment.cpp | 241 ++++++++++++++++ src/environment.h | 36 +++ src/game.cpp | 392 ++++++++------------------ src/map.cpp | 91 +++--- src/map.h | 5 + src/mapnode.cpp | 46 +++ src/mapnode.h | 8 + src/nodedef.cpp | 141 +++++++++ src/nodedef.h | 6 + src/raycast.cpp | 89 ++++++ src/raycast.h | 38 +++ src/unittest/test_voxelalgorithms.cpp | 59 ++++ src/util/pointedthing.cpp | 77 +++-- src/util/pointedthing.h | 40 +++ src/voxelalgorithms.cpp | 68 +++++ src/voxelalgorithms.h | 61 ++++ 20 files changed, 1046 insertions(+), 433 deletions(-) create mode 100644 src/raycast.cpp create mode 100644 src/raycast.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 51cf88063..507624753 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -447,6 +447,7 @@ set(common_SRCS quicktune.cpp reflowscan.cpp remoteplayer.cpp + raycast.cpp rollback.cpp rollback_interface.cpp serialization.cpp diff --git a/src/client.cpp b/src/client.cpp index 1446ebad8..693a90604 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -53,6 +53,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database-sqlite3.h" #include "serialization.h" #include "guiscalingfilter.h" +#include "raycast.h" extern gui::IGUIEnvironment* guienv; @@ -1500,44 +1501,6 @@ void Client::inventoryAction(InventoryAction *a) delete a; } -ClientActiveObject * Client::getSelectedActiveObject( - f32 max_d, - v3f from_pos_f_on_map, - core::line3d shootline_on_map - ) -{ - std::vector objects; - - m_env.getActiveObjects(from_pos_f_on_map, max_d, objects); - - // Sort them. - // After this, the closest object is the first in the array. - std::sort(objects.begin(), objects.end()); - - for(unsigned int i=0; igetSelectionBox(); - if(selection_box == NULL) - continue; - - v3f pos = obj->getPosition(); - - aabb3f offsetted_box( - selection_box->MinEdge + pos, - selection_box->MaxEdge + pos - ); - - if(offsetted_box.intersectsWithLine(shootline_on_map)) - { - return obj; - } - } - - return NULL; -} - float Client::getAnimationTime() { return m_animation_time; diff --git a/src/client.h b/src/client.h index 9f5bda059..891fe62f8 100644 --- a/src/client.h +++ b/src/client.h @@ -445,14 +445,6 @@ public: Inventory* getInventory(const InventoryLocation &loc); void inventoryAction(InventoryAction *a); - // Gets closest object pointed by the shootline - // Returns NULL if not found - ClientActiveObject * getSelectedActiveObject( - f32 max_d, - v3f from_pos_f_on_map, - core::line3d shootline_on_map - ); - const std::list &getConnectedPlayerNames() { return m_env.getPlayerNames(); diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 7d76e6e8b..542eb03e8 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -172,8 +172,6 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) ScopeProfiler sp(g_profiler, "CM::updateDrawList()", SPT_AVG); g_profiler->add("CM::updateDrawList() count", 1); - INodeDefManager *nodemgr = m_gamedef->ndef(); - for (std::map::iterator i = m_drawlist.begin(); i != m_drawlist.end(); ++i) { MapBlock *block = i->second; @@ -219,7 +217,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) if (g_settings->getBool("free_move")) { MapNode n = getNodeNoEx(cam_pos_nodes); if (n.getContent() == CONTENT_IGNORE || - nodemgr->get(n).solidness == 2) + m_nodedef->get(n).solidness == 2) occlusion_culling_enabled = false; } @@ -297,23 +295,23 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) if (occlusion_culling_enabled && // For the central point of the mapblock 'endoff' can be halved isOccluded(this, spn, cpn, - step, stepfac, startoff, endoff / 2.0f, needed_count, nodemgr) && + step, stepfac, startoff, endoff / 2.0f, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(bs2,bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(bs2,bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(bs2,-bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(bs2,-bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(-bs2,bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(-bs2,bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr) && + step, stepfac, startoff, endoff, needed_count, m_nodedef) && isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,-bs2), - step, stepfac, startoff, endoff, needed_count, nodemgr)) { + step, stepfac, startoff, endoff, needed_count, m_nodedef)) { blocks_occlusion_culled++; continue; } @@ -656,7 +654,6 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, int oldvalue, bool *sunlight_seen_result) { const bool debugprint = false; - INodeDefManager *ndef = m_gamedef->ndef(); static v3f z_directions[50] = { v3f(-100, 0, 0) }; @@ -694,7 +691,7 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, float off = step * z_offsets[i]; bool sunlight_seen_now = false; bool ok = getVisibleBrightness(this, m_camera_position, dir, - step, 1.0, max_d*0.6+off, max_d, ndef, daylight_factor, + step, 1.0, max_d*0.6+off, max_d, m_nodedef, daylight_factor, sunlight_min_d, &br, &sunlight_seen_now); if(sunlight_seen_now) @@ -734,8 +731,8 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, int ret = 0; if(brightness_count == 0){ MapNode n = getNodeNoEx(floatToInt(m_camera_position, BS)); - if(ndef->get(n).param_type == CPT_LIGHT){ - ret = decode_light(n.getLightBlend(daylight_factor, ndef)); + if(m_nodedef->get(n).param_type == CPT_LIGHT){ + ret = decode_light(n.getLightBlend(daylight_factor, m_nodedef)); } else { ret = oldvalue; } @@ -758,8 +755,6 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, void ClientMap::renderPostFx(CameraMode cam_mode) { - INodeDefManager *nodemgr = m_gamedef->ndef(); - // Sadly ISceneManager has no "post effects" render pass, in that case we // could just register for that and handle it in renderMap(). @@ -768,7 +763,7 @@ void ClientMap::renderPostFx(CameraMode cam_mode) // - If the player is in a solid node, make everything black. // - If the player is in liquid, draw a semi-transparent overlay. // - Do not if player is in third person mode - const ContentFeatures& features = nodemgr->get(n); + const ContentFeatures& features = m_nodedef->get(n); video::SColor post_effect_color = features.post_effect_color; if(features.solidness == 2 && !(g_settings->getBool("noclip") && m_gamedef->checkLocalPrivilege("noclip")) && diff --git a/src/environment.cpp b/src/environment.cpp index ac9b5b079..8c0daf87b 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -43,8 +43,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "daynightratio.h" #include "map.h" #include "emerge.h" +#include "raycast.h" +#include "voxelalgorithms.h" #include "util/serialize.h" #include "util/basic_macros.h" +#include "util/pointedthing.h" #include "threading/mutex_auto_lock.h" #define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" @@ -2848,4 +2851,242 @@ ClientEnvEvent ClientEnvironment::getClientEvent() return event; } +ClientActiveObject * ClientEnvironment::getSelectedActiveObject( + const core::line3d &shootline_on_map, v3f *intersection_point, + v3s16 *intersection_normal) +{ + std::vector objects; + getActiveObjects(shootline_on_map.start, + shootline_on_map.getLength() + 3, objects); + const v3f line_vector = shootline_on_map.getVector(); + + // Sort them. + // After this, the closest object is the first in the array. + std::sort(objects.begin(), objects.end()); + + /* Because objects can have different nodebox sizes, + * the object whose center is the nearest isn't necessarily + * the closest one. If an object is found, don't stop + * immediately. */ + + f32 d_min = shootline_on_map.getLength(); + ClientActiveObject *nearest_obj = NULL; + for (u32 i = 0; i < objects.size(); i++) { + ClientActiveObject *obj = objects[i].obj; + + aabb3f *selection_box = obj->getSelectionBox(); + if (selection_box == NULL) + continue; + + v3f pos = obj->getPosition(); + + aabb3f offsetted_box(selection_box->MinEdge + pos, + selection_box->MaxEdge + pos); + + if (offsetted_box.getCenter().getDistanceFrom( + shootline_on_map.start) > d_min + 9.6f*BS) { + // Probably there is no active object that has bigger nodebox than + // (-5.5,-5.5,-5.5,5.5,5.5,5.5) + // 9.6 > 5.5*sqrt(3) + break; + } + + v3f current_intersection; + v3s16 current_normal; + if (boxLineCollision(offsetted_box, shootline_on_map.start, line_vector, + ¤t_intersection, ¤t_normal)) { + f32 d_current = current_intersection.getDistanceFrom( + shootline_on_map.start); + if (d_current <= d_min) { + d_min = d_current; + nearest_obj = obj; + *intersection_point = current_intersection; + *intersection_normal = current_normal; + } + } + } + + return nearest_obj; +} + +/* + Check if a node is pointable +*/ +static inline bool isPointableNode(const MapNode &n, + INodeDefManager *ndef, bool liquids_pointable) +{ + const ContentFeatures &features = ndef->get(n); + return features.pointable || + (liquids_pointable && features.isLiquid()); +} + +PointedThing ClientEnvironment::getPointedThing( + core::line3d shootline, + bool liquids_pointable, + bool look_for_object) +{ + PointedThing result; + + INodeDefManager *nodedef = m_map->getNodeDefManager(); + + core::aabbox3d maximal_exceed = nodedef->getSelectionBoxIntUnion(); + // The code needs to search these nodes + core::aabbox3d search_range(-maximal_exceed.MaxEdge, + -maximal_exceed.MinEdge); + // If a node is found, there might be a larger node behind. + // To find it, we have to go further. + s16 maximal_overcheck = + std::max(abs(search_range.MinEdge.X), abs(search_range.MaxEdge.X)) + + std::max(abs(search_range.MinEdge.Y), abs(search_range.MaxEdge.Y)) + + std::max(abs(search_range.MinEdge.Z), abs(search_range.MaxEdge.Z)); + + const v3f original_vector = shootline.getVector(); + const f32 original_length = original_vector.getLength(); + + f32 min_distance = original_length; + + // First try to find an active object + if (look_for_object) { + ClientActiveObject *selected_object = getSelectedActiveObject( + shootline, &result.intersection_point, + &result.intersection_normal); + + if (selected_object != NULL) { + min_distance = + (result.intersection_point - shootline.start).getLength(); + + result.type = POINTEDTHING_OBJECT; + result.object_id = selected_object->getId(); + } + } + + // Reduce shootline + if (original_length > 0) { + shootline.end = shootline.start + + shootline.getVector() / original_length * min_distance; + } + + // Try to find a node that is closer than the selected active + // object (if it exists). + + voxalgo::VoxelLineIterator iterator(shootline.start / BS, + shootline.getVector() / BS); + v3s16 oldnode = iterator.m_current_node_pos; + // Indicates that a node was found. + bool is_node_found = false; + // If a node is found, it is possible that there's a node + // behind it with a large nodebox, so continue the search. + u16 node_foundcounter = 0; + // If a node is found, this is the center of the + // first nodebox the shootline meets. + v3f found_boxcenter(0, 0, 0); + // The untested nodes are in this range. + core::aabbox3d new_nodes; + while (true) { + // Test the nodes around the current node in search_range. + new_nodes = search_range; + new_nodes.MinEdge += iterator.m_current_node_pos; + new_nodes.MaxEdge += iterator.m_current_node_pos; + + // Only check new nodes + v3s16 delta = iterator.m_current_node_pos - oldnode; + if (delta.X > 0) + new_nodes.MinEdge.X = new_nodes.MaxEdge.X; + else if (delta.X < 0) + new_nodes.MaxEdge.X = new_nodes.MinEdge.X; + else if (delta.Y > 0) + new_nodes.MinEdge.Y = new_nodes.MaxEdge.Y; + else if (delta.Y < 0) + new_nodes.MaxEdge.Y = new_nodes.MinEdge.Y; + else if (delta.Z > 0) + new_nodes.MinEdge.Z = new_nodes.MaxEdge.Z; + else if (delta.Z < 0) + new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z; + + // For each untested node + for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++) { + for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++) { + for (s16 z = new_nodes.MinEdge.Z; z <= new_nodes.MaxEdge.Z; z++) { + MapNode n; + v3s16 np(x, y, z); + bool is_valid_position; + + n = m_map->getNodeNoEx(np, &is_valid_position); + if (!(is_valid_position && + isPointableNode(n, nodedef, liquids_pointable))) { + continue; + } + std::vector boxes; + n.getSelectionBoxes(nodedef, &boxes, + n.getNeighbors(np, m_map)); + + v3f npf = intToFloat(np, BS); + for (std::vector::const_iterator i = boxes.begin(); + i != boxes.end(); ++i) { + aabb3f box = *i; + box.MinEdge += npf; + box.MaxEdge += npf; + v3f intersection_point; + v3s16 intersection_normal; + if (!boxLineCollision(box, shootline.start, shootline.getVector(), + &intersection_point, &intersection_normal)) { + continue; + } + f32 distance = (intersection_point - shootline.start).getLength(); + if (distance >= min_distance) { + continue; + } + result.type = POINTEDTHING_NODE; + result.node_undersurface = np; + result.intersection_point = intersection_point; + result.intersection_normal = intersection_normal; + found_boxcenter = box.getCenter(); + min_distance = distance; + is_node_found = true; + } + } + } + } + if (is_node_found) { + node_foundcounter++; + if (node_foundcounter > maximal_overcheck) { + break; + } + } + // Next node + if (iterator.hasNext()) { + oldnode = iterator.m_current_node_pos; + iterator.next(); + } else { + break; + } + } + + if (is_node_found) { + // Set undersurface and abovesurface nodes + f32 d = 0.002 * BS; + v3f fake_intersection = result.intersection_point; + // Move intersection towards its source block. + if (fake_intersection.X < found_boxcenter.X) + fake_intersection.X += d; + else + fake_intersection.X -= d; + + if (fake_intersection.Y < found_boxcenter.Y) + fake_intersection.Y += d; + else + fake_intersection.Y -= d; + + if (fake_intersection.Z < found_boxcenter.Z) + fake_intersection.Z += d; + else + fake_intersection.Z -= d; + + result.node_real_undersurface = floatToInt(fake_intersection, BS); + result.node_abovesurface = result.node_real_undersurface + + result.intersection_normal; + } + return result; +} + #endif // #ifndef SERVER diff --git a/src/environment.h b/src/environment.h index 4bee40e57..84805b462 100644 --- a/src/environment.h +++ b/src/environment.h @@ -55,6 +55,7 @@ class GameScripting; class Player; class RemotePlayer; class PlayerSAO; +class PointedThing; class Environment { @@ -627,6 +628,41 @@ public: // Get event from queue. CEE_NONE is returned if queue is empty. ClientEnvEvent getClientEvent(); + /*! + * Gets closest object pointed by the shootline. + * Returns NULL if not found. + * + * \param[in] shootline_on_map the shootline for + * the test in world coordinates + * \param[out] intersection_point the first point where + * the shootline meets the object. Valid only if + * not NULL is returned. + * \param[out] intersection_normal the normal vector of + * the intersection, pointing outwards. Zero vector if + * the shootline starts in an active object. + * Valid only if not NULL is returned. + */ + ClientActiveObject * getSelectedActiveObject( + const core::line3d &shootline_on_map, + v3f *intersection_point, + v3s16 *intersection_normal + ); + + /*! + * Performs a raycast on the world. + * Returns the first thing the shootline meets. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + */ + PointedThing getPointedThing( + core::line3d shootline, + bool liquids_pointable, + bool look_for_object); + u16 attachement_parent_ids[USHRT_MAX + 1]; const std::list &getPlayerNames() { return m_player_names; } diff --git a/src/game.cpp b/src/game.cpp index 5bdbea617..cfa6234ff 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -265,271 +265,6 @@ public: Client *m_client; }; -/* - Check if a node is pointable -*/ -inline bool isPointableNode(const MapNode &n, - Client *client, bool liquids_pointable) -{ - const ContentFeatures &features = client->getNodeDefManager()->get(n); - return features.pointable || - (liquids_pointable && features.isLiquid()); -} - -static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, - ClientMap *map, MapNode n, u8 bitmask, u8 *neighbors) -{ - MapNode n2 = map->getNodeNoEx(p); - if (nodedef->nodeboxConnects(n, n2, bitmask)) - *neighbors |= bitmask; -} - -static inline u8 getNeighbors(v3s16 p, INodeDefManager *nodedef, ClientMap *map, MapNode n) -{ - u8 neighbors = 0; - const ContentFeatures &f = nodedef->get(n); - // locate possible neighboring nodes to connect to - if (f.drawtype == NDT_NODEBOX && f.node_box.type == NODEBOX_CONNECTED) { - v3s16 p2 = p; - - p2.Y++; - getNeighborConnectingFace(p2, nodedef, map, n, 1, &neighbors); - - p2 = p; - p2.Y--; - getNeighborConnectingFace(p2, nodedef, map, n, 2, &neighbors); - - p2 = p; - p2.Z--; - getNeighborConnectingFace(p2, nodedef, map, n, 4, &neighbors); - - p2 = p; - p2.X--; - getNeighborConnectingFace(p2, nodedef, map, n, 8, &neighbors); - - p2 = p; - p2.Z++; - getNeighborConnectingFace(p2, nodedef, map, n, 16, &neighbors); - - p2 = p; - p2.X++; - getNeighborConnectingFace(p2, nodedef, map, n, 32, &neighbors); - } - - return neighbors; -} - -/* - Find what the player is pointing at -*/ -PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_position, - const v3f &camera_direction, const v3f &camera_position, - core::line3d shootline, f32 d, bool liquids_pointable, - bool look_for_object, const v3s16 &camera_offset, - ClientActiveObject *&selected_object) -{ - PointedThing result; - - std::vector *selectionboxes = hud->getSelectionBoxes(); - selectionboxes->clear(); - static const bool show_entity_selectionbox = g_settings->getBool("show_entity_selectionbox"); - - selected_object = NULL; - - INodeDefManager *nodedef = client->getNodeDefManager(); - ClientMap &map = client->getEnv().getClientMap(); - - f32 min_distance = BS * 1001; - - // First try to find a pointed at active object - if (look_for_object) { - selected_object = client->getSelectedActiveObject(d * BS, - camera_position, shootline); - - if (selected_object != NULL) { - if (show_entity_selectionbox && - selected_object->doShowSelectionBox()) { - aabb3f *selection_box = selected_object->getSelectionBox(); - // Box should exist because object was - // returned in the first place - assert(selection_box); - - v3f pos = selected_object->getPosition(); - selectionboxes->push_back(aabb3f( - selection_box->MinEdge, selection_box->MaxEdge)); - hud->setSelectionPos(pos, camera_offset); - } - - min_distance = (selected_object->getPosition() - camera_position).getLength(); - - hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0)); - result.type = POINTEDTHING_OBJECT; - result.object_id = selected_object->getId(); - } - } - - // That didn't work, try to find a pointed at node - - v3s16 pos_i = floatToInt(player_position, BS); - - /*infostream<<"pos_i=("< 0 ? a : 1); - s16 zend = pos_i.Z + (camera_direction.Z > 0 ? a : 1); - s16 xend = pos_i.X + (camera_direction.X > 0 ? a : 1); - - // Prevent signed number overflow - if (yend == 32767) - yend = 32766; - - if (zend == 32767) - zend = 32766; - - if (xend == 32767) - xend = 32766; - - v3s16 pointed_pos(0, 0, 0); - - for (s16 y = ystart; y <= yend; y++) { - for (s16 z = zstart; z <= zend; z++) { - for (s16 x = xstart; x <= xend; x++) { - MapNode n; - bool is_valid_position; - v3s16 p(x, y, z); - - n = map.getNodeNoEx(p, &is_valid_position); - if (!is_valid_position) { - continue; - } - if (!isPointableNode(n, client, liquids_pointable)) { - continue; - } - - std::vector boxes; - n.getSelectionBoxes(nodedef, &boxes, getNeighbors(p, nodedef, &map, n)); - - v3s16 np(x, y, z); - v3f npf = intToFloat(np, BS); - for (std::vector::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += npf; - box.MaxEdge += npf; - - v3f centerpoint = box.getCenter(); - f32 distance = (centerpoint - camera_position).getLength(); - if (distance >= min_distance) { - continue; - } - if (!box.intersectsWithLine(shootline)) { - continue; - } - result.type = POINTEDTHING_NODE; - min_distance = distance; - pointed_pos = np; - } - } - } - } - - if (result.type == POINTEDTHING_NODE) { - f32 d = 0.001 * BS; - MapNode n = map.getNodeNoEx(pointed_pos); - v3f npf = intToFloat(pointed_pos, BS); - std::vector boxes; - n.getSelectionBoxes(nodedef, &boxes, getNeighbors(pointed_pos, nodedef, &map, n)); - f32 face_min_distance = 1000 * BS; - for (std::vector::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += npf; - box.MaxEdge += npf; - for (u16 j = 0; j < 6; j++) { - v3s16 facedir = g_6dirs[j]; - aabb3f facebox = box; - if (facedir.X > 0) { - facebox.MinEdge.X = facebox.MaxEdge.X - d; - } else if (facedir.X < 0) { - facebox.MaxEdge.X = facebox.MinEdge.X + d; - } else if (facedir.Y > 0) { - facebox.MinEdge.Y = facebox.MaxEdge.Y - d; - } else if (facedir.Y < 0) { - facebox.MaxEdge.Y = facebox.MinEdge.Y + d; - } else if (facedir.Z > 0) { - facebox.MinEdge.Z = facebox.MaxEdge.Z - d; - } else if (facedir.Z < 0) { - facebox.MaxEdge.Z = facebox.MinEdge.Z + d; - } - v3f centerpoint = facebox.getCenter(); - f32 distance = (centerpoint - camera_position).getLength(); - if (distance >= face_min_distance) - continue; - if (!facebox.intersectsWithLine(shootline)) - continue; - result.node_abovesurface = pointed_pos + facedir; - hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z)); - face_min_distance = distance; - } - } - selectionboxes->clear(); - for (std::vector::const_iterator - i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += v3f(-d, -d, -d); - box.MaxEdge += v3f(d, d, d); - selectionboxes->push_back(box); - } - hud->setSelectionPos(intToFloat(pointed_pos, BS), camera_offset); - result.node_undersurface = pointed_pos; - } - - // Update selection mesh light level and vertex colors - if (selectionboxes->size() > 0) { - v3f pf = hud->getSelectionPos(); - v3s16 p = floatToInt(pf, BS); - - // Get selection mesh light level - MapNode n = map.getNodeNoEx(p); - u16 node_light = getInteriorLight(n, -1, nodedef); - u16 light_level = node_light; - - for (u8 i = 0; i < 6; i++) { - n = map.getNodeNoEx(p + g_6dirs[i]); - node_light = getInteriorLight(n, -1, nodedef); - if (node_light > light_level) - light_level = node_light; - } - - video::SColor c = MapBlock_LightColor(255, light_level, 0); - u8 day = c.getRed(); - u8 night = c.getGreen(); - u32 daynight_ratio = client->getEnv().getDayNightRatio(); - finalColorBlend(c, day, night, daynight_ratio); - - // Modify final color a bit with time - u32 timer = porting::getTimeMs() % 5000; - float timerf = (float)(irr::core::PI * ((timer / 2500.0) - 0.5)); - float sin_r = 0.08 * sin(timerf); - float sin_g = 0.08 * sin(timerf + irr::core::PI * 0.5); - float sin_b = 0.08 * sin(timerf + irr::core::PI); - c.setRed(core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255)); - c.setGreen(core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255)); - c.setBlue(core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255)); - - // Set mesh final color - hud->setSelectionMeshColor(c); - } - return result; -} - /* Profiler display */ void update_profiler_gui(gui::IGUIStaticText *guitext_profiler, FontEngine *fe, @@ -1668,6 +1403,23 @@ protected: void updateSound(f32 dtime); void processPlayerInteraction(GameRunData *runData, f32 dtime, bool show_hud, bool show_debug); + /*! + * Returns the object or node the player is pointing at. + * Also updates the selected thing in the Hud. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + * @param[in] camera_offset offset of the camera + * @param[out] selected_object the selected object or + * NULL if not found + */ + PointedThing updatePointedThing( + const core::line3d &shootline, bool liquids_pointable, + bool look_for_object, const v3s16 &camera_offset, + ClientActiveObject *&selected_object); void handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem); void handlePointingAtNode(GameRunData *runData, const PointedThing &pointed, const ItemDefinition &playeritem_def, @@ -3823,14 +3575,11 @@ void Game::processPlayerInteraction(GameRunData *runData, core::line3d shootline; if (camera->getCameraMode() != CAMERA_MODE_THIRD_FRONT) { - shootline = core::line3d(camera_position, - camera_position + camera_direction * BS * (d + 1)); - + camera_position + camera_direction * BS * d); } else { // prevent player pointing anything in front-view - if (camera->getCameraMode() == CAMERA_MODE_THIRD_FRONT) - shootline = core::line3d(0, 0, 0, 0, 0, 0); + shootline = core::line3d(camera_position,camera_position); } #ifdef HAVE_TOUCHSCREENGUI @@ -3843,10 +3592,7 @@ void Game::processPlayerInteraction(GameRunData *runData, #endif - PointedThing pointed = getPointedThing( - // input - client, hud, player_position, camera_direction, - camera_position, shootline, d, + PointedThing pointed = updatePointedThing(shootline, playeritem_def.liquids_pointable, !runData->ldown_for_dig, camera_offset, @@ -3940,6 +3686,104 @@ void Game::processPlayerInteraction(GameRunData *runData, } +PointedThing Game::updatePointedThing( + const core::line3d &shootline, + bool liquids_pointable, + bool look_for_object, + const v3s16 &camera_offset, + ClientActiveObject *&selected_object) +{ + std::vector *selectionboxes = hud->getSelectionBoxes(); + selectionboxes->clear(); + static const bool show_entity_selectionbox = g_settings->getBool( + "show_entity_selectionbox"); + + ClientMap &map = client->getEnv().getClientMap(); + INodeDefManager *nodedef=client->getNodeDefManager(); + + selected_object = NULL; + + PointedThing result=client->getEnv().getPointedThing( + shootline, liquids_pointable, look_for_object); + if (result.type == POINTEDTHING_OBJECT) { + selected_object = client->getEnv().getActiveObject(result.object_id); + if (show_entity_selectionbox && selected_object->doShowSelectionBox()) { + aabb3f *selection_box = selected_object->getSelectionBox(); + + // Box should exist because object was + // returned in the first place + + assert(selection_box); + + v3f pos = selected_object->getPosition(); + selectionboxes->push_back(aabb3f( + selection_box->MinEdge, selection_box->MaxEdge)); + selectionboxes->push_back( + aabb3f(selection_box->MinEdge, selection_box->MaxEdge)); + hud->setSelectionPos(pos, camera_offset); + } + } else if (result.type == POINTEDTHING_NODE) { + // Update selection boxes + MapNode n = map.getNodeNoEx(result.node_undersurface); + std::vector boxes; + n.getSelectionBoxes(nodedef, &boxes, + n.getNeighbors(result.node_undersurface, &map)); + + f32 d = 0.002 * BS; + for (std::vector::const_iterator i = boxes.begin(); + i != boxes.end(); ++i) { + aabb3f box = *i; + box.MinEdge -= v3f(d, d, d); + box.MaxEdge += v3f(d, d, d); + selectionboxes->push_back(box); + } + hud->setSelectionPos(intToFloat(result.node_undersurface, BS), + camera_offset); + } + + // Update selection mesh light level and vertex colors + if (selectionboxes->size() > 0) { + v3f pf = hud->getSelectionPos(); + v3s16 p = floatToInt(pf, BS); + + // Get selection mesh light level + MapNode n = map.getNodeNoEx(p); + u16 node_light = getInteriorLight(n, -1, nodedef); + u16 light_level = node_light; + + for (u8 i = 0; i < 6; i++) { + n = map.getNodeNoEx(p + g_6dirs[i]); + node_light = getInteriorLight(n, -1, nodedef); + if (node_light > light_level) + light_level = node_light; + } + + video::SColor c = MapBlock_LightColor(255, light_level, 0); + u8 day = c.getRed(); + u8 night = c.getGreen(); + u32 daynight_ratio = client->getEnv().getDayNightRatio(); + finalColorBlend(c, day, night, daynight_ratio); + + // Modify final color a bit with time + u32 timer = porting::getTimeMs() % 5000; + float timerf = (float) (irr::core::PI * ((timer / 2500.0) - 0.5)); + float sin_r = 0.08 * sin(timerf); + float sin_g = 0.08 * sin(timerf + irr::core::PI * 0.5); + float sin_b = 0.08 * sin(timerf + irr::core::PI); + c.setRed( + core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255)); + c.setGreen( + core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255)); + c.setBlue( + core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255)); + + // Set mesh final color + hud->setSelectionMeshColor(c); + } + return result; +} + + void Game::handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem) { infostream << "Right Clicked in Air" << std::endl; diff --git a/src/map.cpp b/src/map.cpp index c3b62ded0..53657ce6b 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -66,6 +66,7 @@ Map::Map(std::ostream &dout, IGameDef *gamedef): m_dout(dout), m_gamedef(gamedef), m_sector_cache(NULL), + m_nodedef(gamedef->ndef()), m_transforming_liquid_loop_count_multiplier(1.0f), m_unprocessed_count(0), m_inc_trending_up_start_time(0), @@ -227,7 +228,7 @@ void Map::setNode(v3s16 p, MapNode & n) bool temp_bool; errorstream<<"Map::setNode(): Not allowing to place CONTENT_IGNORE" <<" while trying to replace \"" - <ndef()->get(block->getNodeNoCheck(relpos, &temp_bool)).name + <get(block->getNodeNoCheck(relpos, &temp_bool)).name <<"\" at "< & light_sources, std::map & modified_blocks) { - INodeDefManager *nodemgr = m_gamedef->ndef(); - v3s16 dirs[6] = { v3s16(0,0,1), // back v3s16(0,1,0), // top @@ -353,20 +352,20 @@ void Map::unspreadLight(enum LightBank bank, If the neighbor is dimmer than what was specified as oldlight (the light of the previous node) */ - if(n2.getLight(bank, nodemgr) < oldlight) + if(n2.getLight(bank, m_nodedef) < oldlight) { /* And the neighbor is transparent and it has some light */ - if(nodemgr->get(n2).light_propagates - && n2.getLight(bank, nodemgr) != 0) + if(m_nodedef->get(n2).light_propagates + && n2.getLight(bank, m_nodedef) != 0) { /* Set light to 0 and add to queue */ - u8 current_light = n2.getLight(bank, nodemgr); - n2.setLight(bank, 0, nodemgr); + u8 current_light = n2.getLight(bank, m_nodedef); + n2.setLight(bank, 0, m_nodedef); block->setNode(relpos, n2); unlighted_nodes[n2pos] = current_light; @@ -421,8 +420,6 @@ void Map::spreadLight(enum LightBank bank, std::set & from_nodes, std::map & modified_blocks) { - INodeDefManager *nodemgr = m_gamedef->ndef(); - const v3s16 dirs[6] = { v3s16(0,0,1), // back v3s16(0,1,0), // top @@ -476,7 +473,7 @@ void Map::spreadLight(enum LightBank bank, bool is_valid_position; MapNode n = block->getNode(relpos, &is_valid_position); - u8 oldlight = is_valid_position ? n.getLight(bank, nodemgr) : 0; + u8 oldlight = is_valid_position ? n.getLight(bank, m_nodedef) : 0; u8 newlight = diminish_light(oldlight); // Loop through 6 neighbors @@ -512,7 +509,7 @@ void Map::spreadLight(enum LightBank bank, If the neighbor is brighter than the current node, add to list (it will light up this node on its turn) */ - if(n2.getLight(bank, nodemgr) > undiminish_light(oldlight)) + if(n2.getLight(bank, m_nodedef) > undiminish_light(oldlight)) { lighted_nodes.insert(n2pos); changed = true; @@ -521,11 +518,11 @@ void Map::spreadLight(enum LightBank bank, If the neighbor is dimmer than how much light this node would spread on it, add to list */ - if(n2.getLight(bank, nodemgr) < newlight) + if(n2.getLight(bank, m_nodedef) < newlight) { - if(nodemgr->get(n2).light_propagates) + if(m_nodedef->get(n2).light_propagates) { - n2.setLight(bank, newlight, nodemgr); + n2.setLight(bank, newlight, m_nodedef); block->setNode(relpos, n2); lighted_nodes.insert(n2pos); changed = true; @@ -558,8 +555,6 @@ void Map::updateLighting(enum LightBank bank, std::map & a_blocks, std::map & modified_blocks) { - INodeDefManager *nodemgr = m_gamedef->ndef(); - /*m_dout<<"Map::updateLighting(): " <setNode(p, n); // If node sources light, add to list - u8 source = nodemgr->get(n).light_source; + u8 source = m_nodedef->get(n).light_source; if(source != 0) light_sources.insert(p + posnodes); @@ -810,8 +805,6 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, std::map &modified_blocks, bool remove_metadata) { - INodeDefManager *ndef = m_gamedef->ndef(); - // Collect old node for rollback RollbackNode rollback_oldnode(this, p, m_gamedef); @@ -825,14 +818,14 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, // Set the node on the map // Ignore light (because calling voxalgo::update_lighting_nodes) - n.setLight(LIGHTBANK_DAY, 0, ndef); - n.setLight(LIGHTBANK_NIGHT, 0, ndef); + n.setLight(LIGHTBANK_DAY, 0, m_nodedef); + n.setLight(LIGHTBANK_NIGHT, 0, m_nodedef); setNode(p, n); // Update lighting std::vector > oldnodes; oldnodes.push_back(std::pair(p, oldnode)); - voxalgo::update_lighting_nodes(this, ndef, oldnodes, modified_blocks); + voxalgo::update_lighting_nodes(this, m_nodedef, oldnodes, modified_blocks); for(std::map::iterator i = modified_blocks.begin(); @@ -869,11 +862,10 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, bool is_valid_position; MapNode n2 = getNodeNoEx(p2, &is_valid_position); - if(is_valid_position - && (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR)) - { + if(is_valid_position && + (m_nodedef->get(n2).isLiquid() || + n2.getContent() == CONTENT_AIR)) m_transforming_liquid.push_back(p2); - } } } @@ -1213,9 +1205,6 @@ s32 Map::transforming_liquid_size() { void Map::transformLiquids(std::map &modified_blocks) { - - INodeDefManager *nodemgr = m_gamedef->ndef(); - DSTACK(FUNCTION_NAME); //TimeTaker timer("transformLiquids()"); @@ -1275,12 +1264,12 @@ void Map::transformLiquids(std::map &modified_blocks) // The node which will be placed there if liquid // can't flow into this node. content_t floodable_node = CONTENT_AIR; - const ContentFeatures &cf = nodemgr->get(n0); + const ContentFeatures &cf = m_nodedef->get(n0); LiquidType liquid_type = cf.liquid_type; switch (liquid_type) { case LIQUID_SOURCE: liquid_level = LIQUID_LEVEL_SOURCE; - liquid_kind = nodemgr->getId(cf.liquid_alternative_flowing); + liquid_kind = m_nodedef->getId(cf.liquid_alternative_flowing); break; case LIQUID_FLOWING: liquid_level = (n0.param2 & LIQUID_LEVEL_MASK); @@ -1322,8 +1311,8 @@ void Map::transformLiquids(std::map &modified_blocks) } v3s16 npos = p0 + dirs[i]; NodeNeighbor nb(getNodeNoEx(npos), nt, npos); - const ContentFeatures &cfnb = nodemgr->get(nb.n); - switch (nodemgr->get(nb.n.getContent()).liquid_type) { + const ContentFeatures &cfnb = m_nodedef->get(nb.n); + switch (m_nodedef->get(nb.n.getContent()).liquid_type) { case LIQUID_NONE: if (cfnb.floodable) { airs[num_airs++] = nb; @@ -1351,8 +1340,8 @@ void Map::transformLiquids(std::map &modified_blocks) 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(cfnb.liquid_alternative_flowing); - if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { + liquid_kind = m_nodedef->getId(cfnb.liquid_alternative_flowing); + if (m_nodedef->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { neutrals[num_neutrals++] = nb; } else { // Do not count bottom source, it will screw things up @@ -1363,8 +1352,8 @@ void Map::transformLiquids(std::map &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(cfnb.liquid_alternative_flowing); - if (nodemgr->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { + liquid_kind = m_nodedef->getId(cfnb.liquid_alternative_flowing); + if (m_nodedef->getId(cfnb.liquid_alternative_flowing) != liquid_kind) { neutrals[num_neutrals++] = nb; } else { flows[num_flows++] = nb; @@ -1382,15 +1371,15 @@ void Map::transformLiquids(std::map &modified_blocks) s8 new_node_level = -1; s8 max_node_level = -1; - u8 range = nodemgr->get(liquid_kind).liquid_range; + u8 range = m_nodedef->get(liquid_kind).liquid_range; 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) { + if ((num_sources >= 2 && m_nodedef->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) // or the flowing alternative of the first of the surrounding sources (if it's air), so // it's perfectly safe to use liquid_kind here to determine the new node content. - new_node_content = nodemgr->getId(nodemgr->get(liquid_kind).liquid_alternative_source); + new_node_content = m_nodedef->getId(m_nodedef->get(liquid_kind).liquid_alternative_source); } else if (num_sources >= 1 && sources[0].t != NEIGHBOR_LOWER) { // liquid_kind is set properly, see above max_node_level = new_node_level = LIQUID_LEVEL_MAX; @@ -1427,7 +1416,7 @@ void Map::transformLiquids(std::map &modified_blocks) } } - u8 viscosity = nodemgr->get(liquid_kind).liquid_viscosity; + u8 viscosity = m_nodedef->get(liquid_kind).liquid_viscosity; if (viscosity > 1 && max_node_level != liquid_level) { // amount to gain, limited by viscosity // must be at least 1 in absolute value @@ -1455,7 +1444,7 @@ void Map::transformLiquids(std::map &modified_blocks) 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 || + (m_nodedef->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))) @@ -1467,7 +1456,7 @@ void Map::transformLiquids(std::map &modified_blocks) */ MapNode n00 = n0; //bool flow_down_enabled = (flowing_down && ((n0.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK)); - if (nodemgr->get(new_node_content).liquid_type == LIQUID_FLOWING) { + if (m_nodedef->get(new_node_content).liquid_type == LIQUID_FLOWING) { // set level to last 3 bits, flowing down bit to 4th bit n0.param2 = (flowing_down ? LIQUID_FLOW_DOWN_MASK : 0x00) | (new_node_level & LIQUID_LEVEL_MASK); } else { @@ -1477,8 +1466,8 @@ void Map::transformLiquids(std::map &modified_blocks) n0.setContent(new_node_content); // Ignore light (because calling voxalgo::update_lighting_nodes) - n0.setLight(LIGHTBANK_DAY, 0, nodemgr); - n0.setLight(LIGHTBANK_NIGHT, 0, nodemgr); + n0.setLight(LIGHTBANK_DAY, 0, m_nodedef); + n0.setLight(LIGHTBANK_NIGHT, 0, m_nodedef); // Find out whether there is a suspect for this action std::string suspect; @@ -1512,7 +1501,7 @@ void Map::transformLiquids(std::map &modified_blocks) /* enqueue neighbors for update if neccessary */ - switch (nodemgr->get(n0.getContent()).liquid_type) { + switch (m_nodedef->get(n0.getContent()).liquid_type) { case LIQUID_SOURCE: case LIQUID_FLOWING: // make sure source flows into all neighboring nodes @@ -1535,7 +1524,7 @@ void Map::transformLiquids(std::map &modified_blocks) for (std::deque::iterator iter = must_reflow.begin(); iter != must_reflow.end(); ++iter) m_transforming_liquid.push_back(*iter); - voxalgo::update_lighting_nodes(this, nodemgr, changed_nodes, modified_blocks); + voxalgo::update_lighting_nodes(this, m_nodedef, changed_nodes, modified_blocks); /* ---------------------------------------------------------------------- @@ -1900,7 +1889,7 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) data->blockpos_min = bpmin; data->blockpos_max = bpmax; data->blockpos_requested = blockpos; - data->nodedef = m_gamedef->ndef(); + data->nodedef = m_nodedef; /* Create the whole area of this and the neighboring blocks diff --git a/src/map.h b/src/map.h index e8d40e982..19c94ee80 100644 --- a/src/map.h +++ b/src/map.h @@ -193,6 +193,8 @@ public: virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true) { return getBlockNoCreateNoEx(p); } + inline INodeDefManager * getNodeDefManager() { return m_nodedef; } + // Returns InvalidPositionException if not found bool isNodeUnderground(v3s16 p); @@ -346,6 +348,9 @@ protected: // Queued transforming water nodes UniqueQueue m_transforming_liquid; + // This stores the properties of the nodes on the map. + INodeDefManager *m_nodedef; + private: f32 m_transforming_liquid_loop_count_multiplier; u32 m_unprocessed_count; diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 5efebf3d8..f1a7f3e61 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include "porting.h" #include "nodedef.h" +#include "map.h" #include "content_mapnode.h" // For mapnode_translate_*_internal #include "serialization.h" // For ser_ver_supported #include "util/serialize.h" @@ -453,6 +454,51 @@ void transformNodeBox(const MapNode &n, const NodeBox &nodebox, } } +static inline void getNeighborConnectingFace( + v3s16 p, INodeDefManager *nodedef, + Map *map, MapNode n, u8 bitmask, u8 *neighbors) +{ + MapNode n2 = map->getNodeNoEx(p); + if (nodedef->nodeboxConnects(n, n2, bitmask)) + *neighbors |= bitmask; +} + +u8 MapNode::getNeighbors(v3s16 p, Map *map) +{ + INodeDefManager *nodedef=map->getNodeDefManager(); + u8 neighbors = 0; + const ContentFeatures &f = nodedef->get(*this); + // locate possible neighboring nodes to connect to + if (f.drawtype == NDT_NODEBOX && f.node_box.type == NODEBOX_CONNECTED) { + v3s16 p2 = p; + + p2.Y++; + getNeighborConnectingFace(p2, nodedef, map, *this, 1, &neighbors); + + p2 = p; + p2.Y--; + getNeighborConnectingFace(p2, nodedef, map, *this, 2, &neighbors); + + p2 = p; + p2.Z--; + getNeighborConnectingFace(p2, nodedef, map, *this, 4, &neighbors); + + p2 = p; + p2.X--; + getNeighborConnectingFace(p2, nodedef, map, *this, 8, &neighbors); + + p2 = p; + p2.Z++; + getNeighborConnectingFace(p2, nodedef, map, *this, 16, &neighbors); + + p2 = p; + p2.X++; + getNeighborConnectingFace(p2, nodedef, map, *this, 32, &neighbors); + } + + return neighbors; +} + void MapNode::getNodeBoxes(INodeDefManager *nodemgr, std::vector *boxes, u8 neighbors) { const ContentFeatures &f = nodemgr->get(*this); diff --git a/src/mapnode.h b/src/mapnode.h index 0bd61c554..a3c20e8ff 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include class INodeDefManager; +class Map; /* Naming scheme: @@ -246,6 +247,13 @@ struct MapNode void rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot); + /*! + * Checks which neighbors does this node connect to. + * + * \param p coordinates of the node + */ + u8 getNeighbors(v3s16 p, Map *map); + /* Gets list of node boxes (used for rendering (NDT_NODEBOX)) */ diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 92cdf738e..dbbdf95d2 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -790,9 +790,18 @@ public: virtual void resetNodeResolveState(); virtual void mapNodeboxConnections(); virtual bool nodeboxConnects(MapNode from, MapNode to, u8 connect_face); + virtual core::aabbox3d getSelectionBoxIntUnion() const + { + return m_selection_box_int_union; + } private: void addNameIdMapping(content_t i, std::string name); + /*! + * Recalculates m_selection_box_int_union based on + * m_selection_box_union. + */ + void fixSelectionBoxIntUnion(); // Features indexed by id std::vector m_content_features; @@ -819,6 +828,14 @@ private: // True when all nodes have been registered bool m_node_registration_complete; + + //! The union of all nodes' selection boxes. + aabb3f m_selection_box_union; + /*! + * The smallest box in node coordinates that + * contains all nodes' selection boxes. + */ + core::aabbox3d m_selection_box_int_union; }; @@ -849,6 +866,8 @@ void CNodeDefManager::clear() m_name_id_mapping_with_aliases.clear(); m_group_to_items.clear(); m_next_id = 0; + m_selection_box_union.reset(0,0,0); + m_selection_box_int_union.reset(0,0,0); resetNodeResolveState(); @@ -1007,6 +1026,123 @@ content_t CNodeDefManager::allocateId() } +/*! + * Returns the smallest box that contains all boxes + * in the vector. Box_union is expanded. + * @param[in] boxes the vector containing the boxes + * @param[in, out] box_union the union of the arguments + */ +void boxVectorUnion(const std::vector &boxes, aabb3f *box_union) +{ + for (std::vector::const_iterator it = boxes.begin(); + it != boxes.end(); ++it) { + box_union->addInternalBox(*it); + } +} + + +/*! + * Returns a box that contains the nodebox in every case. + * The argument node_union is expanded. + * @param[in] nodebox the nodebox to be measured + * @param[in] features used to decide whether the nodebox + * can be rotated + * @param[in, out] box_union the union of the arguments + */ +void getNodeBoxUnion(const NodeBox &nodebox, const ContentFeatures &features, + aabb3f *box_union) +{ + switch(nodebox.type) { + case NODEBOX_FIXED: + case NODEBOX_LEVELED: { + // Raw union + aabb3f half_processed(0, 0, 0, 0, 0, 0); + boxVectorUnion(nodebox.fixed, &half_processed); + // Set leveled boxes to maximal + if (nodebox.type == NODEBOX_LEVELED) { + half_processed.MaxEdge.Y = +BS / 2; + } + if (features.param_type_2 == CPT2_FACEDIR) { + // Get maximal coordinate + f32 coords[] = { + fabsf(half_processed.MinEdge.X), + fabsf(half_processed.MinEdge.Y), + fabsf(half_processed.MinEdge.Z), + fabsf(half_processed.MaxEdge.X), + fabsf(half_processed.MaxEdge.Y), + fabsf(half_processed.MaxEdge.Z) }; + f32 max = 0; + for (int i = 0; i < 6; i++) { + if (max < coords[i]) { + max = coords[i]; + } + } + // Add the union of all possible rotated boxes + box_union->addInternalPoint(-max, -max, -max); + box_union->addInternalPoint(+max, +max, +max); + } else { + box_union->addInternalBox(half_processed); + } + break; + } + case NODEBOX_WALLMOUNTED: { + // Add fix boxes + box_union->addInternalBox(nodebox.wall_top); + box_union->addInternalBox(nodebox.wall_bottom); + // Find maximal coordinate in the X-Z plane + f32 coords[] = { + fabsf(nodebox.wall_side.MinEdge.X), + fabsf(nodebox.wall_side.MinEdge.Z), + fabsf(nodebox.wall_side.MaxEdge.X), + fabsf(nodebox.wall_side.MaxEdge.Z) }; + f32 max = 0; + for (int i = 0; i < 4; i++) { + if (max < coords[i]) { + max = coords[i]; + } + } + // Add the union of all possible rotated boxes + box_union->addInternalPoint(-max, nodebox.wall_side.MinEdge.Y, -max); + box_union->addInternalPoint(max, nodebox.wall_side.MaxEdge.Y, max); + break; + } + case NODEBOX_CONNECTED: { + // Add all possible connected boxes + boxVectorUnion(nodebox.fixed, box_union); + boxVectorUnion(nodebox.connect_top, box_union); + boxVectorUnion(nodebox.connect_bottom, box_union); + boxVectorUnion(nodebox.connect_front, box_union); + boxVectorUnion(nodebox.connect_left, box_union); + boxVectorUnion(nodebox.connect_back, box_union); + boxVectorUnion(nodebox.connect_right, box_union); + break; + } + default: { + // NODEBOX_REGULAR + box_union->addInternalPoint(-BS / 2, -BS / 2, -BS / 2); + box_union->addInternalPoint(+BS / 2, +BS / 2, +BS / 2); + } + } +} + + +inline void CNodeDefManager::fixSelectionBoxIntUnion() +{ + m_selection_box_int_union.MinEdge.X = floorf( + m_selection_box_union.MinEdge.X / BS + 0.5f); + m_selection_box_int_union.MinEdge.Y = floorf( + m_selection_box_union.MinEdge.Y / BS + 0.5f); + m_selection_box_int_union.MinEdge.Z = floorf( + m_selection_box_union.MinEdge.Z / BS + 0.5f); + m_selection_box_int_union.MaxEdge.X = ceilf( + m_selection_box_union.MaxEdge.X / BS - 0.5f); + m_selection_box_int_union.MaxEdge.Y = ceilf( + m_selection_box_union.MaxEdge.Y / BS - 0.5f); + m_selection_box_int_union.MaxEdge.Z = ceilf( + m_selection_box_union.MaxEdge.Z / BS - 0.5f); +} + + // IWritableNodeDefManager content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &def) { @@ -1037,6 +1173,8 @@ content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &d verbosestream << "NodeDefManager: registering content id \"" << id << "\": name=\"" << def.name << "\""< getSelectionBoxIntUnion() const=0; }; class IWritableNodeDefManager : public INodeDefManager { @@ -406,6 +411,7 @@ public: virtual void runNodeResolveCallbacks()=0; virtual void resetNodeResolveState()=0; virtual void mapNodeboxConnections()=0; + virtual core::aabbox3d getSelectionBoxIntUnion() const=0; }; IWritableNodeDefManager *createNodeDefManager(); diff --git a/src/raycast.cpp b/src/raycast.cpp new file mode 100644 index 000000000..58102c993 --- /dev/null +++ b/src/raycast.cpp @@ -0,0 +1,89 @@ +/* +Minetest +Copyright (C) 2016 juhdanad, Daniel Juhasz + +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 "irr_v3d.h" +#include "irr_aabb3d.h" + +bool boxLineCollision(const aabb3f &box, const v3f &start, + const v3f &dir, v3f *collision_point, v3s16 *collision_normal) { + if (box.isPointInside(start)) { + *collision_point = start; + collision_normal->set(0, 0, 0); + return true; + } + float m = 0; + + // Test X collision + if (dir.X != 0) { + if (dir.X > 0) + m = (box.MinEdge.X - start.X) / dir.X; + else + m = (box.MaxEdge.X - start.X) / dir.X; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->Y >= box.MinEdge.Y) + && (collision_point->Y <= box.MaxEdge.Y) + && (collision_point->Z >= box.MinEdge.Z) + && (collision_point->Z <= box.MaxEdge.Z)) { + collision_normal->set((dir.X > 0) ? -1 : 1, 0, 0); + return true; + } + } + } + + // Test Y collision + if (dir.Y != 0) { + if (dir.Y > 0) + m = (box.MinEdge.Y - start.Y) / dir.Y; + else + m = (box.MaxEdge.Y - start.Y) / dir.Y; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->X >= box.MinEdge.X) + && (collision_point->X <= box.MaxEdge.X) + && (collision_point->Z >= box.MinEdge.Z) + && (collision_point->Z <= box.MaxEdge.Z)) { + collision_normal->set(0, (dir.Y > 0) ? -1 : 1, 0); + return true; + } + } + } + + // Test Z collision + if (dir.Z != 0) { + if (dir.Z > 0) + m = (box.MinEdge.Z - start.Z) / dir.Z; + else + m = (box.MaxEdge.Z - start.Z) / dir.Z; + + if (m >= 0 && m <= 1) { + *collision_point = start + dir * m; + if ((collision_point->X >= box.MinEdge.X) + && (collision_point->X <= box.MaxEdge.X) + && (collision_point->Y >= box.MinEdge.Y) + && (collision_point->Y <= box.MaxEdge.Y)) { + collision_normal->set(0, 0, (dir.Z > 0) ? -1 : 1); + return true; + } + } + } + return false; +} diff --git a/src/raycast.h b/src/raycast.h new file mode 100644 index 000000000..d7ec8c843 --- /dev/null +++ b/src/raycast.h @@ -0,0 +1,38 @@ +/* +Minetest +Copyright (C) 2016 juhdanad, Daniel Juhasz + +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 SRC_RAYCAST_H_ +#define SRC_RAYCAST_H_ + + +/*! + * Checks if a line and a box intersects. + * @param[in] box box to test collision + * @param[in] start starting point of the line + * @param[in] dir direction and length of the line + * @param[out] collision_point first point of the collision + * @param[out] collision_normal normal vector at the collision, points + * outwards of the surface. If start is in the box, zero vector. + * @returns true if a collision point was found + */ +bool boxLineCollision(const aabb3f &box, const v3f &start, const v3f &dir, + v3f *collision_point, v3s16 *collision_normal); + + +#endif /* SRC_RAYCAST_H_ */ diff --git a/src/unittest/test_voxelalgorithms.cpp b/src/unittest/test_voxelalgorithms.cpp index 31b9cadd5..fd83844af 100644 --- a/src/unittest/test_voxelalgorithms.cpp +++ b/src/unittest/test_voxelalgorithms.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "voxelalgorithms.h" +#include "util/numeric.h" class TestVoxelAlgorithms : public TestBase { public: @@ -31,6 +32,7 @@ public: void testPropogateSunlight(INodeDefManager *ndef); void testClearLightAndCollectSources(INodeDefManager *ndef); + void testVoxelLineIterator(INodeDefManager *ndef); }; static TestVoxelAlgorithms g_test_instance; @@ -41,6 +43,7 @@ void TestVoxelAlgorithms::runTests(IGameDef *gamedef) TEST(testPropogateSunlight, ndef); TEST(testClearLightAndCollectSources, ndef); + TEST(testVoxelLineIterator, ndef); } //////////////////////////////////////////////////////////////////////////////// @@ -202,3 +205,59 @@ void TestVoxelAlgorithms::testClearLightAndCollectSources(INodeDefManager *ndef) UASSERT(unlight_from.size() == 1); } } + +void TestVoxelAlgorithms::testVoxelLineIterator(INodeDefManager *ndef) +{ + // Test some lines + // Do not test lines that start or end on the border of + // two voxels as rounding errors can make the test fail! + std::vector > lines; + for (f32 x = -9.1; x < 9; x += 3.124) { + for (f32 y = -9.2; y < 9; y += 3.123) { + for (f32 z = -9.3; z < 9; z += 3.122) { + lines.push_back(core::line3d(-x, -y, -z, x, y, z)); + } + } + } + lines.push_back(core::line3d(0, 0, 0, 0, 0, 0)); + // Test every line + std::vector >::iterator it = lines.begin(); + for (; it < lines.end(); it++) { + core::line3d l = *it; + + // Initialize test + voxalgo::VoxelLineIterator iterator(l.start, l.getVector()); + + //Test the first voxel + v3s16 start_voxel = floatToInt(l.start, 1); + UASSERT(iterator.m_current_node_pos == start_voxel); + + // Values for testing + v3s16 end_voxel = floatToInt(l.end, 1); + v3s16 voxel_vector = end_voxel - start_voxel; + int nodecount = abs(voxel_vector.X) + abs(voxel_vector.Y) + + abs(voxel_vector.Z); + int actual_nodecount = 0; + v3s16 old_voxel = iterator.m_current_node_pos; + + while (iterator.hasNext()) { + iterator.next(); + actual_nodecount++; + v3s16 new_voxel = iterator.m_current_node_pos; + // This must be a neighbor of the old voxel + UASSERTEQ(f32, (new_voxel - old_voxel).getLengthSQ(), 1); + // The line must intersect with the voxel + v3f voxel_center = intToFloat(iterator.m_current_node_pos, 1); + aabb3f box(voxel_center - v3f(0.5, 0.5, 0.5), + voxel_center + v3f(0.5, 0.5, 0.5)); + UASSERT(box.intersectsWithLine(l)); + // Update old voxel + old_voxel = new_voxel; + } + + // Test last node + UASSERT(iterator.m_current_node_pos == end_voxel); + // Test node count + UASSERTEQ(int, actual_nodecount, nodecount); + } +} diff --git a/src/util/pointedthing.cpp b/src/util/pointedthing.cpp index cd13000b5..ed3d4bb67 100644 --- a/src/util/pointedthing.cpp +++ b/src/util/pointedthing.cpp @@ -27,29 +27,25 @@ PointedThing::PointedThing(): type(POINTEDTHING_NOTHING), node_undersurface(0,0,0), node_abovesurface(0,0,0), + node_real_undersurface(0,0,0), + intersection_point(0,0,0), + intersection_normal(0,0,0), object_id(-1) {} std::string PointedThing::dump() const { std::ostringstream os(std::ios::binary); - if(type == POINTEDTHING_NOTHING) - { + if (type == POINTEDTHING_NOTHING) { os<<"[nothing]"; - } - else if(type == POINTEDTHING_NODE) - { + } else if (type == POINTEDTHING_NODE) { const v3s16 &u = node_undersurface; const v3s16 &a = node_abovesurface; os<<"[node under="< 0) { + m_next_intersection_multi.X = (floorf(m_start_position.X - 0.5) + 1.5 + - m_start_position.X) / m_line_vector.X; + m_intersection_multi_inc.X = 1 / m_line_vector.X; + } else if (m_line_vector.X < 0) { + m_next_intersection_multi.X = (floorf(m_start_position.X - 0.5) + - m_start_position.X + 0.5) / m_line_vector.X; + m_intersection_multi_inc.X = -1 / m_line_vector.X; + m_step_directions.X = -1; + } + + if (m_line_vector.Y > 0) { + m_next_intersection_multi.Y = (floorf(m_start_position.Y - 0.5) + 1.5 + - m_start_position.Y) / m_line_vector.Y; + m_intersection_multi_inc.Y = 1 / m_line_vector.Y; + } else if (m_line_vector.Y < 0) { + m_next_intersection_multi.Y = (floorf(m_start_position.Y - 0.5) + - m_start_position.Y + 0.5) / m_line_vector.Y; + m_intersection_multi_inc.Y = -1 / m_line_vector.Y; + m_step_directions.Y = -1; + } + + if (m_line_vector.Z > 0) { + m_next_intersection_multi.Z = (floorf(m_start_position.Z - 0.5) + 1.5 + - m_start_position.Z) / m_line_vector.Z; + m_intersection_multi_inc.Z = 1 / m_line_vector.Z; + } else if (m_line_vector.Z < 0) { + m_next_intersection_multi.Z = (floorf(m_start_position.Z - 0.5) + - m_start_position.Z + 0.5) / m_line_vector.Z; + m_intersection_multi_inc.Z = -1 / m_line_vector.Z; + m_step_directions.Z = -1; + } + + m_has_next = (m_next_intersection_multi.X <= 1) + || (m_next_intersection_multi.Y <= 1) + || (m_next_intersection_multi.Z <= 1); +} + +void VoxelLineIterator::next() +{ + if ((m_next_intersection_multi.X < m_next_intersection_multi.Y) + && (m_next_intersection_multi.X < m_next_intersection_multi.Z)) { + m_next_intersection_multi.X += m_intersection_multi_inc.X; + m_current_node_pos.X += m_step_directions.X; + } else if ((m_next_intersection_multi.Y < m_next_intersection_multi.Z)) { + m_next_intersection_multi.Y += m_intersection_multi_inc.Y; + m_current_node_pos.Y += m_step_directions.Y; + } else { + m_next_intersection_multi.Z += m_intersection_multi_inc.Z; + m_current_node_pos.Z += m_step_directions.Z; + } + + m_has_next = (m_next_intersection_multi.X <= 1) + || (m_next_intersection_multi.Y <= 1) + || (m_next_intersection_multi.Z <= 1); +} + } // namespace voxalgo diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 3632546dd..5eff8f7ac 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -73,7 +73,68 @@ void update_lighting_nodes( std::vector > &oldnodes, std::map &modified_blocks); +/*! + * This class iterates trough voxels that intersect with + * a line. The collision detection does not see nodeboxes, + * every voxel is a cube and is returned. + * This iterator steps to all nodes exactly once. + */ +struct VoxelLineIterator +{ +public: + //! Starting position of the line in world coordinates. + v3f m_start_position; + //! Direction and length of the line in world coordinates. + v3f m_line_vector; + /*! + * Each component stores the next smallest positive number, by + * which multiplying the line's vector gives a vector that ends + * on the intersection of two nodes. + */ + v3f m_next_intersection_multi; + /*! + * Each component stores the smallest positive number, by which + * m_next_intersection_multi's components can be increased. + */ + v3f m_intersection_multi_inc; + /*! + * Direction of the line. Each component can be -1 or 1 (if a + * component of the line's vector is 0, then there will be 1). + */ + v3s16 m_step_directions; + //! Position of the current node. + v3s16 m_current_node_pos; + //! If true, the next node will intersect the line, too. + bool m_has_next; + + /*! + * Creates a voxel line iterator with the given line. + * @param start_position starting point of the line + * in voxel coordinates + * @param line_vector length and direction of the + * line in voxel coordinates. start_position+line_vector + * is the end of the line + */ + VoxelLineIterator(const v3f &start_position,const v3f &line_vector); + + /*! + * Steps to the next voxel. + * Updates m_current_node_pos and + * m_previous_node_pos. + * Note that it works even if hasNext() is false, + * continuing the line as a ray. + */ + void next(); + + /*! + * Returns true if the next voxel intersects the given line. + */ + inline bool hasNext() const { return m_has_next; } +}; + } // namespace voxalgo + + #endif From ad10b8b762d8097092f307867a36e55049d69546 Mon Sep 17 00:00:00 2001 From: Rogier-5 Date: Tue, 3 Jan 2017 21:23:22 -0800 Subject: [PATCH 026/586] Use std::vector instead of std::map in class ABMHandler --- src/environment.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/environment.cpp b/src/environment.cpp index 8c0daf87b..5eb9d9770 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -767,7 +767,7 @@ class ABMHandler { private: ServerEnvironment *m_env; - std::map > m_aabms; + std::vector *> m_aabms; public: ABMHandler(std::vector &abms, float dtime_s, ServerEnvironment *env, @@ -826,18 +826,22 @@ public: k != ids.end(); ++k) { content_t c = *k; - std::map >::iterator j; - j = m_aabms.find(c); - if(j == m_aabms.end()){ - std::vector aabmlist; - m_aabms[c] = aabmlist; - j = m_aabms.find(c); - } - j->second.push_back(aabm); + if (c >= m_aabms.size()) + m_aabms.resize(c + 256, (std::vector *) NULL); + if (!m_aabms[c]) + m_aabms[c] = new std::vector; + m_aabms[c]->push_back(aabm); } } } } + + ~ABMHandler() + { + for (size_t i = 0; i < m_aabms.size(); i++) + delete m_aabms[i]; + } + // Find out how many objects the given block and its neighbours contain. // Returns the number of objects in the block, and also in 'wider' the // number of objects in the block and all its neighbours. The latter @@ -886,13 +890,11 @@ public: content_t c = n.getContent(); v3s16 p = p0 + block->getPosRelative(); - std::map >::iterator j; - j = m_aabms.find(c); - if(j == m_aabms.end()) + if (!m_aabms[c]) continue; for(std::vector::iterator - i = j->second.begin(); i != j->second.end(); ++i) { + i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { if(myrand() % i->chance != 0) continue; From ca3629637cb20cea318b8811e717e2caab579dc0 Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Wed, 4 Jan 2017 11:11:55 -0800 Subject: [PATCH 027/586] Fixes for using std:vector in ABMHander and further perf improvements --- src/environment.cpp | 10 +++++----- src/mapblock.h | 20 +++++++++++++++++--- src/mapnode.h | 5 ----- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/environment.cpp b/src/environment.cpp index 5eb9d9770..a0cf9dca5 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -827,7 +827,7 @@ public: { content_t c = *k; if (c >= m_aabms.size()) - m_aabms.resize(c + 256, (std::vector *) NULL); + m_aabms.resize(c + 256, NULL); if (!m_aabms[c]) m_aabms[c] = new std::vector; m_aabms[c]->push_back(aabm); @@ -872,7 +872,7 @@ public: } void apply(MapBlock *block) { - if(m_aabms.empty()) + if(m_aabms.empty() || block->isDummy()) return; ServerMap *map = &m_env->getServerMap(); @@ -886,13 +886,13 @@ public: for(p0.Y=0; p0.YgetNodeNoEx(p0); + const MapNode &n = block->getNodeUnsafe(p0); content_t c = n.getContent(); - v3s16 p = p0 + block->getPosRelative(); - if (!m_aabms[c]) + if (c >= m_aabms.size() || !m_aabms[c]) continue; + v3s16 p = p0 + block->getPosRelative(); for(std::vector::iterator i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { if(myrand() % i->chance != 0) diff --git a/src/mapblock.h b/src/mapblock.h index 5adfcf3fb..c737b4c37 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -305,8 +305,7 @@ public: inline MapNode getNodeNoEx(v3s16 p) { bool is_valid; - MapNode node = getNode(p.X, p.Y, p.Z, &is_valid); - return is_valid ? node : MapNode(CONTENT_IGNORE); + return getNode(p.X, p.Y, p.Z, &is_valid); } inline void setNode(s16 x, s16 y, s16 z, MapNode & n) @@ -341,6 +340,22 @@ public: return getNodeNoCheck(p.X, p.Y, p.Z, valid_position); } + //// + //// Non-checking, unsafe variants of the above + //// MapBlock must be loaded by another function in the same scope/function + //// Caller must ensure that this is not a dummy block (by calling isDummy()) + //// + + inline const MapNode &getNodeUnsafe(s16 x, s16 y, s16 z) + { + return data[z * zstride + y * ystride + x]; + } + + inline const MapNode &getNodeUnsafe(v3s16 &p) + { + return getNodeUnsafe(p.X, p.Y, p.Z); + } + inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n) { if (data == NULL) @@ -512,7 +527,6 @@ public: void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version); void deSerializeNetworkSpecific(std::istream &is); - private: /* Private methods diff --git a/src/mapnode.h b/src/mapnode.h index a3c20e8ff..ae0245cfe 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -143,11 +143,6 @@ struct MapNode MapNode() { } - MapNode(const MapNode & n) - { - *this = n; - } - MapNode(content_t content, u8 a_param1=0, u8 a_param2=0) : param0(content), param1(a_param1), From e8b7179ccd5b1f70eba3f9ac570c5f10474cf7a7 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 28 Dec 2016 13:01:32 +0000 Subject: [PATCH 028/586] Expose and document chatcommands as minetest.registered_chatcommands --- builtin/game/chatcommands.lua | 19 ++++++++++--------- doc/lua_api.txt | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 71edeb26a..eb6edc1c8 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -4,14 +4,15 @@ -- Chat command handler -- -core.chatcommands = {} +core.registered_chatcommands = {} +core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY function core.register_chatcommand(cmd, def) def = def or {} def.params = def.params or "" def.description = def.description or "" def.privs = def.privs or {} def.mod_origin = core.get_current_modname() or "??" - core.chatcommands[cmd] = def + core.registered_chatcommands[cmd] = def end core.register_on_chat_message(function(name, message) @@ -19,7 +20,7 @@ core.register_on_chat_message(function(name, message) if not param then param = "" end - local cmd_def = core.chatcommands[cmd] + local cmd_def = core.registered_chatcommands[cmd] if not cmd_def then return false end @@ -107,7 +108,7 @@ core.register_chatcommand("help", { if param == "" then local msg = "" local cmds = {} - for cmd, def in pairs(core.chatcommands) do + for cmd, def in pairs(core.registered_chatcommands) do if core.check_player_privs(name, def.privs) then cmds[#cmds + 1] = cmd end @@ -118,7 +119,7 @@ core.register_chatcommand("help", { .. " or '/help all' to list everything." elseif param == "all" then local cmds = {} - for cmd, def in pairs(core.chatcommands) do + for cmd, def in pairs(core.registered_chatcommands) do if core.check_player_privs(name, def.privs) then cmds[#cmds + 1] = format_help_line(cmd, def) end @@ -134,7 +135,7 @@ core.register_chatcommand("help", { return true, "Available privileges:\n"..table.concat(privs, "\n") else local cmd = param - local def = core.chatcommands[cmd] + local def = core.registered_chatcommands[cmd] if not def then return false, "Command not available: "..cmd else @@ -161,7 +162,7 @@ local function handle_grant_command(caller, grantname, grantprivstr) if not (caller_privs.privs or caller_privs.basic_privs) then return false, "Your privileges are insufficient." end - + if not core.get_auth_handler().get_auth(grantname) then return false, "Player " .. grantname .. " does not exist." end @@ -204,7 +205,7 @@ core.register_chatcommand("grant", { local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)") if not grantname or not grantprivstr then return false, "Invalid parameters (see /help grant)" - end + end return handle_grant_command(name, grantname, grantprivstr) end, }) @@ -215,7 +216,7 @@ core.register_chatcommand("grantme", { func = function(name, param) if param == "" then return false, "Invalid parameters (see /help grantme)" - end + end return handle_grant_command(name, name, param) end, }) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6166826af..6f83039c8 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2076,6 +2076,7 @@ Call these functions only at load time! ### Other registration functions * `minetest.register_chatcommand(cmd, chatcommand definition)` + * Adds definition to minetest.registered_chatcommands * `minetest.register_privilege(name, definition)` * `definition`: `"description text"` * `definition`: `{ description = "description text", give_to_singleplayer = boolean}` From 8f22272df5423cfc6cdf4425787d7f148ee4ca6c Mon Sep 17 00:00:00 2001 From: Wayward1 Date: Wed, 4 Jan 2017 19:44:11 -0500 Subject: [PATCH 029/586] Add raycast.cpp and tileanimation.cpp to Android.mk --- build/android/jni/Android.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index c2186efaf..2567457b9 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -203,6 +203,7 @@ LOCAL_SRC_FILES := \ jni/src/porting.cpp \ jni/src/profiler.cpp \ jni/src/quicktune.cpp \ + jni/src/raycast.cpp \ jni/src/reflowscan.cpp \ jni/src/remoteplayer.cpp \ jni/src/rollback.cpp \ @@ -218,6 +219,7 @@ LOCAL_SRC_FILES := \ jni/src/sound_openal.cpp \ jni/src/staticobject.cpp \ jni/src/subgame.cpp \ + jni/src/tileanimation.cpp \ jni/src/tool.cpp \ jni/src/treegen.cpp \ jni/src/version.cpp \ From 545c37f6139125c9a2f9cc0ecfd1d3ff1f44b832 Mon Sep 17 00:00:00 2001 From: LNJ Date: Thu, 5 Jan 2017 22:38:43 +0100 Subject: [PATCH 030/586] lua_api.txt: Add registered_chatcommands to global tables --- doc/lua_api.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6f83039c8..d05db9d49 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2729,6 +2729,8 @@ These functions return the leftover itemstack. * Map of object references, indexed by active object id * `minetest.luaentities` * Map of Lua entities, indexed by active object id +* `minetest.registered_chatcommands` + * Map of registered chat command definitions, indexed by name * `minetest.registered_ores` * List of registered ore definitions. * `minetest.registered_biomes` From b387f95ed31e9d1dc61ffd10f19187349705d6c9 Mon Sep 17 00:00:00 2001 From: LNJ Date: Thu, 5 Jan 2017 21:28:58 +0100 Subject: [PATCH 031/586] README.txt: Update the License to 2010-2017 --- README.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.txt b/README.txt index 5d4d15263..8bd8554ed 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ Minetest An InfiniMiner/Minecraft inspired game. -Copyright (c) 2010-2013 Perttu Ahola +Copyright (c) 2010-2017 Perttu Ahola and contributors (see source file comments and the version control log) In case you downloaded the source code: @@ -427,7 +427,7 @@ License of Minetest source code ------------------------------- Minetest -Copyright (C) 2010-2013 celeron55, Perttu Ahola +Copyright (C) 2010-2017 celeron55, Perttu Ahola 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 From c435eabf3ffb77eab955d5faeb5450da1befc149 Mon Sep 17 00:00:00 2001 From: red-001 Date: Sat, 3 Dec 2016 11:38:07 +0000 Subject: [PATCH 032/586] Extend minetest.is_yes() --- src/unittest/test_utilities.cpp | 2 ++ src/util/string.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp index d73975b9f..58412dd85 100644 --- a/src/unittest/test_utilities.cpp +++ b/src/unittest/test_utilities.cpp @@ -147,6 +147,8 @@ void TestUtilities::testIsYes() UASSERT(is_yes("0") == false); UASSERT(is_yes("1") == true); UASSERT(is_yes("2") == true); + UASSERT(is_yes("on") == true); + UASSERT(is_yes("off") == false); } diff --git a/src/util/string.h b/src/util/string.h index 572c37150..ba3c09e51 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -272,7 +272,7 @@ inline bool is_yes(const std::string &str) { std::string s2 = lowercase(trim(str)); - return s2 == "y" || s2 == "yes" || s2 == "true" || atoi(s2.c_str()) != 0; + return s2 == "y" || s2 == "yes" || s2 == "true" || s2 == "on" || atoi(s2.c_str()) != 0; } From ce106a4113de048718ab9f396db3d368c35218fc Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 7 Jan 2017 11:05:05 +0100 Subject: [PATCH 033/586] Revert "Extend minetest.is_yes()" This reverts commit c435eabf3ffb77eab955d5faeb5450da1befc149. --- src/unittest/test_utilities.cpp | 2 -- src/util/string.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp index 58412dd85..d73975b9f 100644 --- a/src/unittest/test_utilities.cpp +++ b/src/unittest/test_utilities.cpp @@ -147,8 +147,6 @@ void TestUtilities::testIsYes() UASSERT(is_yes("0") == false); UASSERT(is_yes("1") == true); UASSERT(is_yes("2") == true); - UASSERT(is_yes("on") == true); - UASSERT(is_yes("off") == false); } diff --git a/src/util/string.h b/src/util/string.h index ba3c09e51..572c37150 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -272,7 +272,7 @@ inline bool is_yes(const std::string &str) { std::string s2 = lowercase(trim(str)); - return s2 == "y" || s2 == "yes" || s2 == "true" || s2 == "on" || atoi(s2.c_str()) != 0; + return s2 == "y" || s2 == "yes" || s2 == "true" || atoi(s2.c_str()) != 0; } From 8f9611bcb20f4eca69abb204bf5dc28f62fab4a2 Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sat, 7 Jan 2017 11:33:38 +0000 Subject: [PATCH 034/586] Make column alignment consistent in advanced settings (#5004) --- builtin/mainmenu/dlg_settings_advanced.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua index b0d923768..85218c852 100644 --- a/builtin/mainmenu/dlg_settings_advanced.lua +++ b/builtin/mainmenu/dlg_settings_advanced.lua @@ -544,7 +544,7 @@ end local function create_settings_formspec(tabview, name, tabdata) local formspec = "size[12,6.5;true]" .. - "tablecolumns[color;tree;text;text]" .. + "tablecolumns[color;tree;text,width=32;text]" .. "tableoptions[background=#00000000;border=false]" .. "table[0,0;12,5.5;list_settings;" From b0746834cc44af1086c83715d0d6f749f653f29a Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Sat, 7 Jan 2017 23:42:25 -0800 Subject: [PATCH 035/586] Get neighbor from same map block if possible in ABMHandler (#4998) --- src/environment.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/environment.cpp b/src/environment.cpp index a0cf9dca5..50f5d58aa 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -902,14 +902,23 @@ public: if(!i->required_neighbors.empty()) { v3s16 p1; - for(p1.X = p.X-1; p1.X <= p.X+1; p1.X++) - for(p1.Y = p.Y-1; p1.Y <= p.Y+1; p1.Y++) - for(p1.Z = p.Z-1; p1.Z <= p.Z+1; p1.Z++) + for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) + for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) + for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) { - if(p1 == p) + if(p1 == p0) continue; - MapNode n = map->getNodeNoEx(p1); - content_t c = n.getContent(); + content_t c; + if (block->isValidPosition(p1)) { + // if the neighbor is found on the same map block + // get it straight from there + const MapNode &n = block->getNodeUnsafe(p1); + c = n.getContent(); + } else { + // otherwise consult the map + MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); + c = n.getContent(); + } std::set::const_iterator k; k = i->required_neighbors.find(c); if(k != i->required_neighbors.end()){ From eb2c19bbedecb5f42c946b0c14466abc0b109825 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sun, 8 Jan 2017 10:49:47 +0100 Subject: [PATCH 036/586] Move ClientEnvironment to dedicated cpp/header files --- src/CMakeLists.txt | 1 + src/client.h | 2 +- src/clientenvironment.cpp | 847 ++++++++++++++++++++++++++++++++++++++ src/clientenvironment.h | 191 +++++++++ src/collision.cpp | 6 +- src/content_cso.cpp | 3 +- src/environment.cpp | 828 ------------------------------------- src/environment.h | 167 -------- 8 files changed, 1042 insertions(+), 1003 deletions(-) create mode 100644 src/clientenvironment.cpp create mode 100644 src/clientenvironment.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 507624753..5228eb9ac 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -508,6 +508,7 @@ set(client_SRCS ${client_irrlicht_changes_SRCS} camera.cpp client.cpp + clientenvironment.cpp clientmap.cpp clientmedia.cpp clientobject.cpp diff --git a/src/client.h b/src/client.h index 891fe62f8..9a09704a6 100644 --- a/src/client.h +++ b/src/client.h @@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define CLIENT_HEADER #include "network/connection.h" -#include "environment.h" +#include "clientenvironment.h" #include "irrlichttypes_extrabloated.h" #include "threading/mutex.h" #include diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp new file mode 100644 index 000000000..e831de109 --- /dev/null +++ b/src/clientenvironment.cpp @@ -0,0 +1,847 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola + +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 "util/serialize.h" +#include "util/pointedthing.h" +#include "clientenvironment.h" +#include "clientsimpleobject.h" +#include "clientmap.h" +#include "mapblock_mesh.h" +#include "event.h" +#include "collision.h" +#include "profiler.h" +#include "raycast.h" +#include "voxelalgorithms.h" + +/* + ClientEnvironment +*/ + +ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, + ITextureSource *texturesource, IGameDef *gamedef, + IrrlichtDevice *irr): + m_map(map), + m_local_player(NULL), + m_smgr(smgr), + m_texturesource(texturesource), + m_gamedef(gamedef), + m_irr(irr) +{ + char zero = 0; + memset(attachement_parent_ids, zero, sizeof(attachement_parent_ids)); +} + +ClientEnvironment::~ClientEnvironment() +{ + // delete active objects + for (UNORDERED_MAP::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + delete i->second; + } + + for(std::vector::iterator + i = m_simple_objects.begin(); i != m_simple_objects.end(); ++i) { + delete *i; + } + + // Drop/delete map + m_map->drop(); +} + +Map & ClientEnvironment::getMap() +{ + return *m_map; +} + +ClientMap & ClientEnvironment::getClientMap() +{ + return *m_map; +} + +void ClientEnvironment::setLocalPlayer(LocalPlayer *player) +{ + DSTACK(FUNCTION_NAME); + /* + It is a failure if already is a local player + */ + FATAL_ERROR_IF(m_local_player != NULL, + "Local player already allocated"); + + m_local_player = player; +} + +void ClientEnvironment::step(float dtime) +{ + DSTACK(FUNCTION_NAME); + + /* Step time of day */ + stepTimeOfDay(dtime); + + // Get some settings + bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); + bool free_move = fly_allowed && g_settings->getBool("free_move"); + + // Get local player + LocalPlayer *lplayer = getLocalPlayer(); + assert(lplayer); + // collision info queue + std::vector player_collisions; + + /* + Get the speed the player is going + */ + bool is_climbing = lplayer->is_climbing; + + f32 player_speed = lplayer->getSpeed().getLength(); + + /* + Maximum position increment + */ + //f32 position_max_increment = 0.05*BS; + f32 position_max_increment = 0.1*BS; + + // Maximum time increment (for collision detection etc) + // time = distance / speed + f32 dtime_max_increment = 1; + if(player_speed > 0.001) + dtime_max_increment = position_max_increment / player_speed; + + // Maximum time increment is 10ms or lower + if(dtime_max_increment > 0.01) + dtime_max_increment = 0.01; + + // Don't allow overly huge dtime + if(dtime > 0.5) + dtime = 0.5; + + f32 dtime_downcount = dtime; + + /* + Stuff that has a maximum time increment + */ + + u32 loopcount = 0; + do + { + loopcount++; + + f32 dtime_part; + if(dtime_downcount > dtime_max_increment) + { + dtime_part = dtime_max_increment; + dtime_downcount -= dtime_part; + } + else + { + dtime_part = dtime_downcount; + /* + Setting this to 0 (no -=dtime_part) disables an infinite loop + when dtime_part is so small that dtime_downcount -= dtime_part + does nothing + */ + dtime_downcount = 0; + } + + /* + Handle local player + */ + + { + // Apply physics + if(!free_move && !is_climbing) + { + // Gravity + v3f speed = lplayer->getSpeed(); + if(!lplayer->in_liquid) + speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2; + + // Liquid floating / sinking + if(lplayer->in_liquid && !lplayer->swimming_vertical) + speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2; + + // Liquid resistance + if(lplayer->in_liquid_stable || lplayer->in_liquid) + { + // How much the node's viscosity blocks movement, ranges between 0 and 1 + // Should match the scale at which viscosity increase affects other liquid attributes + const f32 viscosity_factor = 0.3; + + v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; + f32 dl = d_wanted.getLength(); + if(dl > lplayer->movement_liquid_fluidity_smooth) + dl = lplayer->movement_liquid_fluidity_smooth; + dl *= (lplayer->liquid_viscosity * viscosity_factor) + (1 - viscosity_factor); + + v3f d = d_wanted.normalize() * dl; + speed += d; + } + + lplayer->setSpeed(speed); + } + + /* + Move the lplayer. + This also does collision detection. + */ + lplayer->move(dtime_part, this, position_max_increment, + &player_collisions); + } + } + while(dtime_downcount > 0.001); + + //std::cout<<"Looped "<::iterator i = player_collisions.begin(); + i != player_collisions.end(); ++i) { + CollisionInfo &info = *i; + v3f speed_diff = info.new_speed - info.old_speed;; + // Handle only fall damage + // (because otherwise walking against something in fast_move kills you) + if(speed_diff.Y < 0 || info.old_speed.Y >= 0) + continue; + // Get rid of other components + speed_diff.X = 0; + speed_diff.Z = 0; + f32 pre_factor = 1; // 1 hp per node/s + f32 tolerance = BS*14; // 5 without damage + f32 post_factor = 1; // 1 hp per node/s + if(info.type == COLLISION_NODE) + { + const ContentFeatures &f = m_gamedef->ndef()-> + get(m_map->getNodeNoEx(info.node_p)); + // Determine fall damage multiplier + int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); + pre_factor = 1.0 + (float)addp/100.0; + } + float speed = pre_factor * speed_diff.getLength(); + if(speed > tolerance) + { + f32 damage_f = (speed - tolerance)/BS * post_factor; + u16 damage = (u16)(damage_f+0.5); + if(damage != 0){ + damageLocalPlayer(damage, true); + MtEvent *e = new SimpleTriggerEvent("PlayerFallingDamage"); + m_gamedef->event()->put(e); + } + } + } + + /* + A quick draft of lava damage + */ + if(m_lava_hurt_interval.step(dtime, 1.0)) + { + v3f pf = lplayer->getPosition(); + + // Feet, middle and head + v3s16 p1 = floatToInt(pf + v3f(0, BS*0.1, 0), BS); + MapNode n1 = m_map->getNodeNoEx(p1); + v3s16 p2 = floatToInt(pf + v3f(0, BS*0.8, 0), BS); + MapNode n2 = m_map->getNodeNoEx(p2); + v3s16 p3 = floatToInt(pf + v3f(0, BS*1.6, 0), BS); + MapNode n3 = m_map->getNodeNoEx(p3); + + u32 damage_per_second = 0; + damage_per_second = MYMAX(damage_per_second, + m_gamedef->ndef()->get(n1).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_gamedef->ndef()->get(n2).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_gamedef->ndef()->get(n3).damage_per_second); + + if(damage_per_second != 0) + { + damageLocalPlayer(damage_per_second, true); + } + } + + // Protocol v29 make this behaviour obsolete + if (((Client*) getGameDef())->getProtoVersion() < 29) { + /* + Drowning + */ + if (m_drowning_interval.step(dtime, 2.0)) { + v3f pf = lplayer->getPosition(); + + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_gamedef->ndef()->get(n); + u8 drowning_damage = c.drowning; + if (drowning_damage > 0 && lplayer->hp > 0) { + u16 breath = lplayer->getBreath(); + if (breath > 10) { + breath = 11; + } + if (breath > 0) { + breath -= 1; + } + lplayer->setBreath(breath); + updateLocalPlayerBreath(breath); + } + + if (lplayer->getBreath() == 0 && drowning_damage > 0) { + damageLocalPlayer(drowning_damage, true); + } + } + if (m_breathing_interval.step(dtime, 0.5)) { + v3f pf = lplayer->getPosition(); + + // head + v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n = m_map->getNodeNoEx(p); + ContentFeatures c = m_gamedef->ndef()->get(n); + if (!lplayer->hp) { + lplayer->setBreath(11); + } else if (c.drowning == 0) { + u16 breath = lplayer->getBreath(); + if (breath <= 10) { + breath += 1; + lplayer->setBreath(breath); + updateLocalPlayerBreath(breath); + } + } + } + } + + // Update lighting on local player (used for wield item) + u32 day_night_ratio = getDayNightRatio(); + { + // Get node at head + + // On InvalidPositionException, use this as default + // (day: LIGHT_SUN, night: 0) + MapNode node_at_lplayer(CONTENT_AIR, 0x0f, 0); + + v3s16 p = lplayer->getLightPosition(); + node_at_lplayer = m_map->getNodeNoEx(p); + + u16 light = getInteriorLight(node_at_lplayer, 0, m_gamedef->ndef()); + u8 day = light & 0xff; + u8 night = (light >> 8) & 0xff; + finalColorBlend(lplayer->light_color, day, night, day_night_ratio); + } + + /* + Step active objects and update lighting of them + */ + + g_profiler->avg("CEnv: num of objects", m_active_objects.size()); + bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); + for (UNORDERED_MAP::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ClientActiveObject* obj = i->second; + // Step object + obj->step(dtime, this); + + if(update_lighting) + { + // Update lighting + u8 light = 0; + bool pos_ok; + + // Get node at head + v3s16 p = obj->getLightPosition(); + MapNode n = m_map->getNodeNoEx(p, &pos_ok); + if (pos_ok) + light = n.getLightBlend(day_night_ratio, m_gamedef->ndef()); + else + light = blend_light(day_night_ratio, LIGHT_SUN, 0); + + obj->updateLight(light); + } + } + + /* + Step and handle simple objects + */ + g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); + for(std::vector::iterator + i = m_simple_objects.begin(); i != m_simple_objects.end();) { + std::vector::iterator cur = i; + ClientSimpleObject *simple = *cur; + + simple->step(dtime); + if(simple->m_to_be_removed) { + delete simple; + i = m_simple_objects.erase(cur); + } + else { + ++i; + } + } +} + +void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple) +{ + m_simple_objects.push_back(simple); +} + +GenericCAO* ClientEnvironment::getGenericCAO(u16 id) +{ + ClientActiveObject *obj = getActiveObject(id); + if (obj && obj->getType() == ACTIVEOBJECT_TYPE_GENERIC) + return (GenericCAO*) obj; + else + return NULL; +} + +ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) +{ + UNORDERED_MAP::iterator n = m_active_objects.find(id); + if (n == m_active_objects.end()) + return NULL; + return n->second; +} + +bool isFreeClientActiveObjectId(const u16 id, + UNORDERED_MAP &objects) +{ + if(id == 0) + return false; + + return objects.find(id) == objects.end(); +} + +u16 getFreeClientActiveObjectId(UNORDERED_MAP &objects) +{ + //try to reuse id's as late as possible + static u16 last_used_id = 0; + u16 startid = last_used_id; + for(;;) { + last_used_id ++; + if (isFreeClientActiveObjectId(last_used_id, objects)) + return last_used_id; + + if (last_used_id == startid) + return 0; + } +} + +u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) +{ + assert(object); // Pre-condition + if(object->getId() == 0) + { + u16 new_id = getFreeClientActiveObjectId(m_active_objects); + if(new_id == 0) + { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"no free ids available"<setId(new_id); + } + if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"id is not free ("<getId()<<")"<getId()] = object; + object->addToScene(m_smgr, m_texturesource, m_irr); + { // Update lighting immediately + u8 light = 0; + bool pos_ok; + + // Get node at head + v3s16 p = object->getLightPosition(); + MapNode n = m_map->getNodeNoEx(p, &pos_ok); + if (pos_ok) + light = n.getLightBlend(getDayNightRatio(), m_gamedef->ndef()); + else + light = blend_light(getDayNightRatio(), LIGHT_SUN, 0); + + object->updateLight(light); + } + return object->getId(); +} + +void ClientEnvironment::addActiveObject(u16 id, u8 type, + const std::string &init_data) +{ + ClientActiveObject* obj = + ClientActiveObject::create((ActiveObjectType) type, m_gamedef, this); + if(obj == NULL) + { + infostream<<"ClientEnvironment::addActiveObject(): " + <<"id="<setId(id); + + try + { + obj->initialize(init_data); + } + catch(SerializationError &e) + { + errorstream<<"ClientEnvironment::addActiveObject():" + <<" id="<removeFromScene(true); + delete obj; + m_active_objects.erase(id); +} + +void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data) +{ + ClientActiveObject *obj = getActiveObject(id); + if (obj == NULL) { + infostream << "ClientEnvironment::processActiveObjectMessage():" + << " got message for id=" << id << ", which doesn't exist." + << std::endl; + return; + } + + try { + obj->processMessage(data); + } catch (SerializationError &e) { + errorstream<<"ClientEnvironment::processActiveObjectMessage():" + << " id=" << id << " type=" << obj->getType() + << " SerializationError in processMessage(): " << e.what() + << std::endl; + } +} + +/* + Callbacks for activeobjects +*/ + +void ClientEnvironment::damageLocalPlayer(u8 damage, bool handle_hp) +{ + LocalPlayer *lplayer = getLocalPlayer(); + assert(lplayer); + + if (handle_hp) { + if (lplayer->hp > damage) + lplayer->hp -= damage; + else + lplayer->hp = 0; + } + + ClientEnvEvent event; + event.type = CEE_PLAYER_DAMAGE; + event.player_damage.amount = damage; + event.player_damage.send_to_server = handle_hp; + m_client_event_queue.push(event); +} + +void ClientEnvironment::updateLocalPlayerBreath(u16 breath) +{ + ClientEnvEvent event; + event.type = CEE_PLAYER_BREATH; + event.player_breath.amount = breath; + m_client_event_queue.push(event); +} + +/* + Client likes to call these +*/ + +void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, + std::vector &dest) +{ + for (UNORDERED_MAP::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ClientActiveObject* obj = i->second; + + f32 d = (obj->getPosition() - origin).getLength(); + + if(d > max_d) + continue; + + DistanceSortedActiveObject dso(obj, d); + + dest.push_back(dso); + } +} + +ClientEnvEvent ClientEnvironment::getClientEvent() +{ + ClientEnvEvent event; + if(m_client_event_queue.empty()) + event.type = CEE_NONE; + else { + event = m_client_event_queue.front(); + m_client_event_queue.pop(); + } + return event; +} + +ClientActiveObject * ClientEnvironment::getSelectedActiveObject( + const core::line3d &shootline_on_map, v3f *intersection_point, + v3s16 *intersection_normal) +{ + std::vector objects; + getActiveObjects(shootline_on_map.start, + shootline_on_map.getLength() + 3, objects); + const v3f line_vector = shootline_on_map.getVector(); + + // Sort them. + // After this, the closest object is the first in the array. + std::sort(objects.begin(), objects.end()); + + /* Because objects can have different nodebox sizes, + * the object whose center is the nearest isn't necessarily + * the closest one. If an object is found, don't stop + * immediately. */ + + f32 d_min = shootline_on_map.getLength(); + ClientActiveObject *nearest_obj = NULL; + for (u32 i = 0; i < objects.size(); i++) { + ClientActiveObject *obj = objects[i].obj; + + aabb3f *selection_box = obj->getSelectionBox(); + if (selection_box == NULL) + continue; + + v3f pos = obj->getPosition(); + + aabb3f offsetted_box(selection_box->MinEdge + pos, + selection_box->MaxEdge + pos); + + if (offsetted_box.getCenter().getDistanceFrom( + shootline_on_map.start) > d_min + 9.6f*BS) { + // Probably there is no active object that has bigger nodebox than + // (-5.5,-5.5,-5.5,5.5,5.5,5.5) + // 9.6 > 5.5*sqrt(3) + break; + } + + v3f current_intersection; + v3s16 current_normal; + if (boxLineCollision(offsetted_box, shootline_on_map.start, line_vector, + ¤t_intersection, ¤t_normal)) { + f32 d_current = current_intersection.getDistanceFrom( + shootline_on_map.start); + if (d_current <= d_min) { + d_min = d_current; + nearest_obj = obj; + *intersection_point = current_intersection; + *intersection_normal = current_normal; + } + } + } + + return nearest_obj; +} + +/* + Check if a node is pointable +*/ +static inline bool isPointableNode(const MapNode &n, + INodeDefManager *ndef, bool liquids_pointable) +{ + const ContentFeatures &features = ndef->get(n); + return features.pointable || + (liquids_pointable && features.isLiquid()); +} + +PointedThing ClientEnvironment::getPointedThing( + core::line3d shootline, + bool liquids_pointable, + bool look_for_object) +{ + PointedThing result; + + INodeDefManager *nodedef = m_map->getNodeDefManager(); + + core::aabbox3d maximal_exceed = nodedef->getSelectionBoxIntUnion(); + // The code needs to search these nodes + core::aabbox3d search_range(-maximal_exceed.MaxEdge, + -maximal_exceed.MinEdge); + // If a node is found, there might be a larger node behind. + // To find it, we have to go further. + s16 maximal_overcheck = + std::max(abs(search_range.MinEdge.X), abs(search_range.MaxEdge.X)) + + std::max(abs(search_range.MinEdge.Y), abs(search_range.MaxEdge.Y)) + + std::max(abs(search_range.MinEdge.Z), abs(search_range.MaxEdge.Z)); + + const v3f original_vector = shootline.getVector(); + const f32 original_length = original_vector.getLength(); + + f32 min_distance = original_length; + + // First try to find an active object + if (look_for_object) { + ClientActiveObject *selected_object = getSelectedActiveObject( + shootline, &result.intersection_point, + &result.intersection_normal); + + if (selected_object != NULL) { + min_distance = + (result.intersection_point - shootline.start).getLength(); + + result.type = POINTEDTHING_OBJECT; + result.object_id = selected_object->getId(); + } + } + + // Reduce shootline + if (original_length > 0) { + shootline.end = shootline.start + + shootline.getVector() / original_length * min_distance; + } + + // Try to find a node that is closer than the selected active + // object (if it exists). + + voxalgo::VoxelLineIterator iterator(shootline.start / BS, + shootline.getVector() / BS); + v3s16 oldnode = iterator.m_current_node_pos; + // Indicates that a node was found. + bool is_node_found = false; + // If a node is found, it is possible that there's a node + // behind it with a large nodebox, so continue the search. + u16 node_foundcounter = 0; + // If a node is found, this is the center of the + // first nodebox the shootline meets. + v3f found_boxcenter(0, 0, 0); + // The untested nodes are in this range. + core::aabbox3d new_nodes; + while (true) { + // Test the nodes around the current node in search_range. + new_nodes = search_range; + new_nodes.MinEdge += iterator.m_current_node_pos; + new_nodes.MaxEdge += iterator.m_current_node_pos; + + // Only check new nodes + v3s16 delta = iterator.m_current_node_pos - oldnode; + if (delta.X > 0) + new_nodes.MinEdge.X = new_nodes.MaxEdge.X; + else if (delta.X < 0) + new_nodes.MaxEdge.X = new_nodes.MinEdge.X; + else if (delta.Y > 0) + new_nodes.MinEdge.Y = new_nodes.MaxEdge.Y; + else if (delta.Y < 0) + new_nodes.MaxEdge.Y = new_nodes.MinEdge.Y; + else if (delta.Z > 0) + new_nodes.MinEdge.Z = new_nodes.MaxEdge.Z; + else if (delta.Z < 0) + new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z; + + // For each untested node + for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++) { + for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++) { + for (s16 z = new_nodes.MinEdge.Z; z <= new_nodes.MaxEdge.Z; z++) { + MapNode n; + v3s16 np(x, y, z); + bool is_valid_position; + + n = m_map->getNodeNoEx(np, &is_valid_position); + if (!(is_valid_position && + isPointableNode(n, nodedef, liquids_pointable))) { + continue; + } + std::vector boxes; + n.getSelectionBoxes(nodedef, &boxes, + n.getNeighbors(np, m_map)); + + v3f npf = intToFloat(np, BS); + for (std::vector::const_iterator i = boxes.begin(); + i != boxes.end(); ++i) { + aabb3f box = *i; + box.MinEdge += npf; + box.MaxEdge += npf; + v3f intersection_point; + v3s16 intersection_normal; + if (!boxLineCollision(box, shootline.start, shootline.getVector(), + &intersection_point, &intersection_normal)) { + continue; + } + f32 distance = (intersection_point - shootline.start).getLength(); + if (distance >= min_distance) { + continue; + } + result.type = POINTEDTHING_NODE; + result.node_undersurface = np; + result.intersection_point = intersection_point; + result.intersection_normal = intersection_normal; + found_boxcenter = box.getCenter(); + min_distance = distance; + is_node_found = true; + } + } + } + } + if (is_node_found) { + node_foundcounter++; + if (node_foundcounter > maximal_overcheck) { + break; + } + } + // Next node + if (iterator.hasNext()) { + oldnode = iterator.m_current_node_pos; + iterator.next(); + } else { + break; + } + } + + if (is_node_found) { + // Set undersurface and abovesurface nodes + f32 d = 0.002 * BS; + v3f fake_intersection = result.intersection_point; + // Move intersection towards its source block. + if (fake_intersection.X < found_boxcenter.X) + fake_intersection.X += d; + else + fake_intersection.X -= d; + + if (fake_intersection.Y < found_boxcenter.Y) + fake_intersection.Y += d; + else + fake_intersection.Y -= d; + + if (fake_intersection.Z < found_boxcenter.Z) + fake_intersection.Z += d; + else + fake_intersection.Z -= d; + + result.node_real_undersurface = floatToInt(fake_intersection, BS); + result.node_abovesurface = result.node_real_undersurface + + result.intersection_normal; + } + return result; +} diff --git a/src/clientenvironment.h b/src/clientenvironment.h new file mode 100644 index 000000000..e6292b5b7 --- /dev/null +++ b/src/clientenvironment.h @@ -0,0 +1,191 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola + +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 CLIENT_ENVIRONMENT_HEADER +#define CLIENT_ENVIRONMENT_HEADER + +#include +#include +#include "environment.h" +#include "clientobject.h" + +class ClientSimpleObject; +class ClientMap; +class ClientActiveObject; +class GenericCAO; +class LocalPlayer; + +/* + The client-side environment. + + This is not thread-safe. + Must be called from main (irrlicht) thread (uses the SceneManager) + Client uses an environment mutex. +*/ + +enum ClientEnvEventType +{ + CEE_NONE, + CEE_PLAYER_DAMAGE, + CEE_PLAYER_BREATH +}; + +struct ClientEnvEvent +{ + ClientEnvEventType type; + union { + //struct{ + //} none; + struct{ + u8 amount; + bool send_to_server; + } player_damage; + struct{ + u16 amount; + } player_breath; + }; +}; + +class ClientEnvironment : public Environment +{ +public: + ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, + ITextureSource *texturesource, IGameDef *gamedef, + IrrlichtDevice *device); + ~ClientEnvironment(); + + Map & getMap(); + ClientMap & getClientMap(); + + IGameDef *getGameDef() + { return m_gamedef; } + + void step(f32 dtime); + + virtual void setLocalPlayer(LocalPlayer *player); + LocalPlayer *getLocalPlayer() { return m_local_player; } + + /* + ClientSimpleObjects + */ + + void addSimpleObject(ClientSimpleObject *simple); + + /* + ActiveObjects + */ + + GenericCAO* getGenericCAO(u16 id); + ClientActiveObject* getActiveObject(u16 id); + + /* + Adds an active object to the environment. + Environment handles deletion of object. + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObject(ClientActiveObject *object); + + void addActiveObject(u16 id, u8 type, const std::string &init_data); + void removeActiveObject(u16 id); + + void processActiveObjectMessage(u16 id, const std::string &data); + + /* + Callbacks for activeobjects + */ + + void damageLocalPlayer(u8 damage, bool handle_hp=true); + void updateLocalPlayerBreath(u16 breath); + + /* + Client likes to call these + */ + + // Get all nearby objects + void getActiveObjects(v3f origin, f32 max_d, + std::vector &dest); + + // Get event from queue. CEE_NONE is returned if queue is empty. + ClientEnvEvent getClientEvent(); + + /*! + * Gets closest object pointed by the shootline. + * Returns NULL if not found. + * + * \param[in] shootline_on_map the shootline for + * the test in world coordinates + * \param[out] intersection_point the first point where + * the shootline meets the object. Valid only if + * not NULL is returned. + * \param[out] intersection_normal the normal vector of + * the intersection, pointing outwards. Zero vector if + * the shootline starts in an active object. + * Valid only if not NULL is returned. + */ + ClientActiveObject * getSelectedActiveObject( + const core::line3d &shootline_on_map, + v3f *intersection_point, + v3s16 *intersection_normal + ); + + /*! + * Performs a raycast on the world. + * Returns the first thing the shootline meets. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + */ + PointedThing getPointedThing( + core::line3d shootline, + bool liquids_pointable, + bool look_for_object); + + u16 attachement_parent_ids[USHRT_MAX + 1]; + + const std::list &getPlayerNames() { return m_player_names; } + void addPlayerName(const std::string &name) { m_player_names.push_back(name); } + void removePlayerName(const std::string &name) { m_player_names.remove(name); } + void updateCameraOffset(v3s16 camera_offset) + { m_camera_offset = camera_offset; } + v3s16 getCameraOffset() const { return m_camera_offset; } +private: + ClientMap *m_map; + LocalPlayer *m_local_player; + scene::ISceneManager *m_smgr; + ITextureSource *m_texturesource; + IGameDef *m_gamedef; + IrrlichtDevice *m_irr; + UNORDERED_MAP m_active_objects; + std::vector m_simple_objects; + std::queue m_client_event_queue; + IntervalLimiter m_active_object_light_update_interval; + IntervalLimiter m_lava_hurt_interval; + IntervalLimiter m_drowning_interval; + IntervalLimiter m_breathing_interval; + std::list m_player_names; + v3s16 m_camera_offset; +}; + +#endif diff --git a/src/collision.cpp b/src/collision.cpp index 8e5dbcc9b..21f14bec1 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -22,12 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "nodedef.h" #include "gamedef.h" -#include "log.h" -#include "environment.h" +#include "clientenvironment.h" #include "serverobject.h" -#include -#include -#include "util/timetaker.h" #include "profiler.h" // float error is 10 - 9.96875 = 0.03125 diff --git a/src/content_cso.cpp b/src/content_cso.cpp index 0790024fc..c0407f460 100644 --- a/src/content_cso.cpp +++ b/src/content_cso.cpp @@ -20,9 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_cso.h" #include #include "client/tile.h" -#include "environment.h" +#include "clientenvironment.h" #include "gamedef.h" -#include "log.h" #include "map.h" /* diff --git a/src/environment.cpp b/src/environment.cpp index 50f5d58aa..6f6e20238 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -33,12 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "nodemetadata.h" #include "gamedef.h" -#ifndef SERVER -#include "clientmap.h" -#include "localplayer.h" -#include "mapblock_mesh.h" -#include "event.h" -#endif #include "server.h" #include "daynightratio.h" #include "map.h" @@ -2279,825 +2273,3 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) } } -#ifndef SERVER - -#include "clientsimpleobject.h" - -/* - ClientEnvironment -*/ - -ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, - IrrlichtDevice *irr): - m_map(map), - m_local_player(NULL), - m_smgr(smgr), - m_texturesource(texturesource), - m_gamedef(gamedef), - m_irr(irr) -{ - char zero = 0; - memset(attachement_parent_ids, zero, sizeof(attachement_parent_ids)); -} - -ClientEnvironment::~ClientEnvironment() -{ - // delete active objects - for (UNORDERED_MAP::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - delete i->second; - } - - for(std::vector::iterator - i = m_simple_objects.begin(); i != m_simple_objects.end(); ++i) { - delete *i; - } - - // Drop/delete map - m_map->drop(); -} - -Map & ClientEnvironment::getMap() -{ - return *m_map; -} - -ClientMap & ClientEnvironment::getClientMap() -{ - return *m_map; -} - -void ClientEnvironment::setLocalPlayer(LocalPlayer *player) -{ - DSTACK(FUNCTION_NAME); - /* - It is a failure if already is a local player - */ - FATAL_ERROR_IF(m_local_player != NULL, - "Local player already allocated"); - - m_local_player = player; -} - -void ClientEnvironment::step(float dtime) -{ - DSTACK(FUNCTION_NAME); - - /* Step time of day */ - stepTimeOfDay(dtime); - - // Get some settings - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool free_move = fly_allowed && g_settings->getBool("free_move"); - - // Get local player - LocalPlayer *lplayer = getLocalPlayer(); - assert(lplayer); - // collision info queue - std::vector player_collisions; - - /* - Get the speed the player is going - */ - bool is_climbing = lplayer->is_climbing; - - f32 player_speed = lplayer->getSpeed().getLength(); - - /* - Maximum position increment - */ - //f32 position_max_increment = 0.05*BS; - f32 position_max_increment = 0.1*BS; - - // Maximum time increment (for collision detection etc) - // time = distance / speed - f32 dtime_max_increment = 1; - if(player_speed > 0.001) - dtime_max_increment = position_max_increment / player_speed; - - // Maximum time increment is 10ms or lower - if(dtime_max_increment > 0.01) - dtime_max_increment = 0.01; - - // Don't allow overly huge dtime - if(dtime > 0.5) - dtime = 0.5; - - f32 dtime_downcount = dtime; - - /* - Stuff that has a maximum time increment - */ - - u32 loopcount = 0; - do - { - loopcount++; - - f32 dtime_part; - if(dtime_downcount > dtime_max_increment) - { - dtime_part = dtime_max_increment; - dtime_downcount -= dtime_part; - } - else - { - dtime_part = dtime_downcount; - /* - Setting this to 0 (no -=dtime_part) disables an infinite loop - when dtime_part is so small that dtime_downcount -= dtime_part - does nothing - */ - dtime_downcount = 0; - } - - /* - Handle local player - */ - - { - // Apply physics - if(!free_move && !is_climbing) - { - // Gravity - v3f speed = lplayer->getSpeed(); - if(!lplayer->in_liquid) - speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2; - - // Liquid floating / sinking - if(lplayer->in_liquid && !lplayer->swimming_vertical) - speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2; - - // Liquid resistance - if(lplayer->in_liquid_stable || lplayer->in_liquid) - { - // How much the node's viscosity blocks movement, ranges between 0 and 1 - // Should match the scale at which viscosity increase affects other liquid attributes - const f32 viscosity_factor = 0.3; - - v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; - f32 dl = d_wanted.getLength(); - if(dl > lplayer->movement_liquid_fluidity_smooth) - dl = lplayer->movement_liquid_fluidity_smooth; - dl *= (lplayer->liquid_viscosity * viscosity_factor) + (1 - viscosity_factor); - - v3f d = d_wanted.normalize() * dl; - speed += d; - } - - lplayer->setSpeed(speed); - } - - /* - Move the lplayer. - This also does collision detection. - */ - lplayer->move(dtime_part, this, position_max_increment, - &player_collisions); - } - } - while(dtime_downcount > 0.001); - - //std::cout<<"Looped "<::iterator i = player_collisions.begin(); - i != player_collisions.end(); ++i) { - CollisionInfo &info = *i; - v3f speed_diff = info.new_speed - info.old_speed;; - // Handle only fall damage - // (because otherwise walking against something in fast_move kills you) - if(speed_diff.Y < 0 || info.old_speed.Y >= 0) - continue; - // Get rid of other components - speed_diff.X = 0; - speed_diff.Z = 0; - f32 pre_factor = 1; // 1 hp per node/s - f32 tolerance = BS*14; // 5 without damage - f32 post_factor = 1; // 1 hp per node/s - if(info.type == COLLISION_NODE) - { - const ContentFeatures &f = m_gamedef->ndef()-> - get(m_map->getNodeNoEx(info.node_p)); - // Determine fall damage multiplier - int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); - pre_factor = 1.0 + (float)addp/100.0; - } - float speed = pre_factor * speed_diff.getLength(); - if(speed > tolerance) - { - f32 damage_f = (speed - tolerance)/BS * post_factor; - u16 damage = (u16)(damage_f+0.5); - if(damage != 0){ - damageLocalPlayer(damage, true); - MtEvent *e = new SimpleTriggerEvent("PlayerFallingDamage"); - m_gamedef->event()->put(e); - } - } - } - - /* - A quick draft of lava damage - */ - if(m_lava_hurt_interval.step(dtime, 1.0)) - { - v3f pf = lplayer->getPosition(); - - // Feet, middle and head - v3s16 p1 = floatToInt(pf + v3f(0, BS*0.1, 0), BS); - MapNode n1 = m_map->getNodeNoEx(p1); - v3s16 p2 = floatToInt(pf + v3f(0, BS*0.8, 0), BS); - MapNode n2 = m_map->getNodeNoEx(p2); - v3s16 p3 = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n3 = m_map->getNodeNoEx(p3); - - u32 damage_per_second = 0; - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n1).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n2).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n3).damage_per_second); - - if(damage_per_second != 0) - { - damageLocalPlayer(damage_per_second, true); - } - } - - // Protocol v29 make this behaviour obsolete - if (((Client*) getGameDef())->getProtoVersion() < 29) { - /* - Drowning - */ - if (m_drowning_interval.step(dtime, 2.0)) { - v3f pf = lplayer->getPosition(); - - // head - v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - u8 drowning_damage = c.drowning; - if (drowning_damage > 0 && lplayer->hp > 0) { - u16 breath = lplayer->getBreath(); - if (breath > 10) { - breath = 11; - } - if (breath > 0) { - breath -= 1; - } - lplayer->setBreath(breath); - updateLocalPlayerBreath(breath); - } - - if (lplayer->getBreath() == 0 && drowning_damage > 0) { - damageLocalPlayer(drowning_damage, true); - } - } - if (m_breathing_interval.step(dtime, 0.5)) { - v3f pf = lplayer->getPosition(); - - // head - v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); - MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); - if (!lplayer->hp) { - lplayer->setBreath(11); - } else if (c.drowning == 0) { - u16 breath = lplayer->getBreath(); - if (breath <= 10) { - breath += 1; - lplayer->setBreath(breath); - updateLocalPlayerBreath(breath); - } - } - } - } - - // Update lighting on local player (used for wield item) - u32 day_night_ratio = getDayNightRatio(); - { - // Get node at head - - // On InvalidPositionException, use this as default - // (day: LIGHT_SUN, night: 0) - MapNode node_at_lplayer(CONTENT_AIR, 0x0f, 0); - - v3s16 p = lplayer->getLightPosition(); - node_at_lplayer = m_map->getNodeNoEx(p); - - u16 light = getInteriorLight(node_at_lplayer, 0, m_gamedef->ndef()); - u8 day = light & 0xff; - u8 night = (light >> 8) & 0xff; - finalColorBlend(lplayer->light_color, day, night, day_night_ratio); - } - - /* - Step active objects and update lighting of them - */ - - g_profiler->avg("CEnv: num of objects", m_active_objects.size()); - bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21); - for (UNORDERED_MAP::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i->second; - // Step object - obj->step(dtime, this); - - if(update_lighting) - { - // Update lighting - u8 light = 0; - bool pos_ok; - - // Get node at head - v3s16 p = obj->getLightPosition(); - MapNode n = m_map->getNodeNoEx(p, &pos_ok); - if (pos_ok) - light = n.getLightBlend(day_night_ratio, m_gamedef->ndef()); - else - light = blend_light(day_night_ratio, LIGHT_SUN, 0); - - obj->updateLight(light); - } - } - - /* - Step and handle simple objects - */ - g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); - for(std::vector::iterator - i = m_simple_objects.begin(); i != m_simple_objects.end();) { - std::vector::iterator cur = i; - ClientSimpleObject *simple = *cur; - - simple->step(dtime); - if(simple->m_to_be_removed) { - delete simple; - i = m_simple_objects.erase(cur); - } - else { - ++i; - } - } -} - -void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple) -{ - m_simple_objects.push_back(simple); -} - -GenericCAO* ClientEnvironment::getGenericCAO(u16 id) -{ - ClientActiveObject *obj = getActiveObject(id); - if (obj && obj->getType() == ACTIVEOBJECT_TYPE_GENERIC) - return (GenericCAO*) obj; - else - return NULL; -} - -ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) -{ - UNORDERED_MAP::iterator n = m_active_objects.find(id); - if (n == m_active_objects.end()) - return NULL; - return n->second; -} - -bool isFreeClientActiveObjectId(const u16 id, - UNORDERED_MAP &objects) -{ - if(id == 0) - return false; - - return objects.find(id) == objects.end(); -} - -u16 getFreeClientActiveObjectId(UNORDERED_MAP &objects) -{ - //try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) { - last_used_id ++; - if (isFreeClientActiveObjectId(last_used_id, objects)) - return last_used_id; - - if (last_used_id == startid) - return 0; - } -} - -u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) -{ - assert(object); // Pre-condition - if(object->getId() == 0) - { - u16 new_id = getFreeClientActiveObjectId(m_active_objects); - if(new_id == 0) - { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"no free ids available"<setId(new_id); - } - if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"id is not free ("<getId()<<")"<getId()] = object; - object->addToScene(m_smgr, m_texturesource, m_irr); - { // Update lighting immediately - u8 light = 0; - bool pos_ok; - - // Get node at head - v3s16 p = object->getLightPosition(); - MapNode n = m_map->getNodeNoEx(p, &pos_ok); - if (pos_ok) - light = n.getLightBlend(getDayNightRatio(), m_gamedef->ndef()); - else - light = blend_light(getDayNightRatio(), LIGHT_SUN, 0); - - object->updateLight(light); - } - return object->getId(); -} - -void ClientEnvironment::addActiveObject(u16 id, u8 type, - const std::string &init_data) -{ - ClientActiveObject* obj = - ClientActiveObject::create((ActiveObjectType) type, m_gamedef, this); - if(obj == NULL) - { - infostream<<"ClientEnvironment::addActiveObject(): " - <<"id="<setId(id); - - try - { - obj->initialize(init_data); - } - catch(SerializationError &e) - { - errorstream<<"ClientEnvironment::addActiveObject():" - <<" id="<removeFromScene(true); - delete obj; - m_active_objects.erase(id); -} - -void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data) -{ - ClientActiveObject *obj = getActiveObject(id); - if (obj == NULL) { - infostream << "ClientEnvironment::processActiveObjectMessage():" - << " got message for id=" << id << ", which doesn't exist." - << std::endl; - return; - } - - try { - obj->processMessage(data); - } catch (SerializationError &e) { - errorstream<<"ClientEnvironment::processActiveObjectMessage():" - << " id=" << id << " type=" << obj->getType() - << " SerializationError in processMessage(): " << e.what() - << std::endl; - } -} - -/* - Callbacks for activeobjects -*/ - -void ClientEnvironment::damageLocalPlayer(u8 damage, bool handle_hp) -{ - LocalPlayer *lplayer = getLocalPlayer(); - assert(lplayer); - - if (handle_hp) { - if (lplayer->hp > damage) - lplayer->hp -= damage; - else - lplayer->hp = 0; - } - - ClientEnvEvent event; - event.type = CEE_PLAYER_DAMAGE; - event.player_damage.amount = damage; - event.player_damage.send_to_server = handle_hp; - m_client_event_queue.push(event); -} - -void ClientEnvironment::updateLocalPlayerBreath(u16 breath) -{ - ClientEnvEvent event; - event.type = CEE_PLAYER_BREATH; - event.player_breath.amount = breath; - m_client_event_queue.push(event); -} - -/* - Client likes to call these -*/ - -void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d, - std::vector &dest) -{ - for (UNORDERED_MAP::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ClientActiveObject* obj = i->second; - - f32 d = (obj->getPosition() - origin).getLength(); - - if(d > max_d) - continue; - - DistanceSortedActiveObject dso(obj, d); - - dest.push_back(dso); - } -} - -ClientEnvEvent ClientEnvironment::getClientEvent() -{ - ClientEnvEvent event; - if(m_client_event_queue.empty()) - event.type = CEE_NONE; - else { - event = m_client_event_queue.front(); - m_client_event_queue.pop(); - } - return event; -} - -ClientActiveObject * ClientEnvironment::getSelectedActiveObject( - const core::line3d &shootline_on_map, v3f *intersection_point, - v3s16 *intersection_normal) -{ - std::vector objects; - getActiveObjects(shootline_on_map.start, - shootline_on_map.getLength() + 3, objects); - const v3f line_vector = shootline_on_map.getVector(); - - // Sort them. - // After this, the closest object is the first in the array. - std::sort(objects.begin(), objects.end()); - - /* Because objects can have different nodebox sizes, - * the object whose center is the nearest isn't necessarily - * the closest one. If an object is found, don't stop - * immediately. */ - - f32 d_min = shootline_on_map.getLength(); - ClientActiveObject *nearest_obj = NULL; - for (u32 i = 0; i < objects.size(); i++) { - ClientActiveObject *obj = objects[i].obj; - - aabb3f *selection_box = obj->getSelectionBox(); - if (selection_box == NULL) - continue; - - v3f pos = obj->getPosition(); - - aabb3f offsetted_box(selection_box->MinEdge + pos, - selection_box->MaxEdge + pos); - - if (offsetted_box.getCenter().getDistanceFrom( - shootline_on_map.start) > d_min + 9.6f*BS) { - // Probably there is no active object that has bigger nodebox than - // (-5.5,-5.5,-5.5,5.5,5.5,5.5) - // 9.6 > 5.5*sqrt(3) - break; - } - - v3f current_intersection; - v3s16 current_normal; - if (boxLineCollision(offsetted_box, shootline_on_map.start, line_vector, - ¤t_intersection, ¤t_normal)) { - f32 d_current = current_intersection.getDistanceFrom( - shootline_on_map.start); - if (d_current <= d_min) { - d_min = d_current; - nearest_obj = obj; - *intersection_point = current_intersection; - *intersection_normal = current_normal; - } - } - } - - return nearest_obj; -} - -/* - Check if a node is pointable -*/ -static inline bool isPointableNode(const MapNode &n, - INodeDefManager *ndef, bool liquids_pointable) -{ - const ContentFeatures &features = ndef->get(n); - return features.pointable || - (liquids_pointable && features.isLiquid()); -} - -PointedThing ClientEnvironment::getPointedThing( - core::line3d shootline, - bool liquids_pointable, - bool look_for_object) -{ - PointedThing result; - - INodeDefManager *nodedef = m_map->getNodeDefManager(); - - core::aabbox3d maximal_exceed = nodedef->getSelectionBoxIntUnion(); - // The code needs to search these nodes - core::aabbox3d search_range(-maximal_exceed.MaxEdge, - -maximal_exceed.MinEdge); - // If a node is found, there might be a larger node behind. - // To find it, we have to go further. - s16 maximal_overcheck = - std::max(abs(search_range.MinEdge.X), abs(search_range.MaxEdge.X)) - + std::max(abs(search_range.MinEdge.Y), abs(search_range.MaxEdge.Y)) - + std::max(abs(search_range.MinEdge.Z), abs(search_range.MaxEdge.Z)); - - const v3f original_vector = shootline.getVector(); - const f32 original_length = original_vector.getLength(); - - f32 min_distance = original_length; - - // First try to find an active object - if (look_for_object) { - ClientActiveObject *selected_object = getSelectedActiveObject( - shootline, &result.intersection_point, - &result.intersection_normal); - - if (selected_object != NULL) { - min_distance = - (result.intersection_point - shootline.start).getLength(); - - result.type = POINTEDTHING_OBJECT; - result.object_id = selected_object->getId(); - } - } - - // Reduce shootline - if (original_length > 0) { - shootline.end = shootline.start - + shootline.getVector() / original_length * min_distance; - } - - // Try to find a node that is closer than the selected active - // object (if it exists). - - voxalgo::VoxelLineIterator iterator(shootline.start / BS, - shootline.getVector() / BS); - v3s16 oldnode = iterator.m_current_node_pos; - // Indicates that a node was found. - bool is_node_found = false; - // If a node is found, it is possible that there's a node - // behind it with a large nodebox, so continue the search. - u16 node_foundcounter = 0; - // If a node is found, this is the center of the - // first nodebox the shootline meets. - v3f found_boxcenter(0, 0, 0); - // The untested nodes are in this range. - core::aabbox3d new_nodes; - while (true) { - // Test the nodes around the current node in search_range. - new_nodes = search_range; - new_nodes.MinEdge += iterator.m_current_node_pos; - new_nodes.MaxEdge += iterator.m_current_node_pos; - - // Only check new nodes - v3s16 delta = iterator.m_current_node_pos - oldnode; - if (delta.X > 0) - new_nodes.MinEdge.X = new_nodes.MaxEdge.X; - else if (delta.X < 0) - new_nodes.MaxEdge.X = new_nodes.MinEdge.X; - else if (delta.Y > 0) - new_nodes.MinEdge.Y = new_nodes.MaxEdge.Y; - else if (delta.Y < 0) - new_nodes.MaxEdge.Y = new_nodes.MinEdge.Y; - else if (delta.Z > 0) - new_nodes.MinEdge.Z = new_nodes.MaxEdge.Z; - else if (delta.Z < 0) - new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z; - - // For each untested node - for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++) { - for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++) { - for (s16 z = new_nodes.MinEdge.Z; z <= new_nodes.MaxEdge.Z; z++) { - MapNode n; - v3s16 np(x, y, z); - bool is_valid_position; - - n = m_map->getNodeNoEx(np, &is_valid_position); - if (!(is_valid_position && - isPointableNode(n, nodedef, liquids_pointable))) { - continue; - } - std::vector boxes; - n.getSelectionBoxes(nodedef, &boxes, - n.getNeighbors(np, m_map)); - - v3f npf = intToFloat(np, BS); - for (std::vector::const_iterator i = boxes.begin(); - i != boxes.end(); ++i) { - aabb3f box = *i; - box.MinEdge += npf; - box.MaxEdge += npf; - v3f intersection_point; - v3s16 intersection_normal; - if (!boxLineCollision(box, shootline.start, shootline.getVector(), - &intersection_point, &intersection_normal)) { - continue; - } - f32 distance = (intersection_point - shootline.start).getLength(); - if (distance >= min_distance) { - continue; - } - result.type = POINTEDTHING_NODE; - result.node_undersurface = np; - result.intersection_point = intersection_point; - result.intersection_normal = intersection_normal; - found_boxcenter = box.getCenter(); - min_distance = distance; - is_node_found = true; - } - } - } - } - if (is_node_found) { - node_foundcounter++; - if (node_foundcounter > maximal_overcheck) { - break; - } - } - // Next node - if (iterator.hasNext()) { - oldnode = iterator.m_current_node_pos; - iterator.next(); - } else { - break; - } - } - - if (is_node_found) { - // Set undersurface and abovesurface nodes - f32 d = 0.002 * BS; - v3f fake_intersection = result.intersection_point; - // Move intersection towards its source block. - if (fake_intersection.X < found_boxcenter.X) - fake_intersection.X += d; - else - fake_intersection.X -= d; - - if (fake_intersection.Y < found_boxcenter.Y) - fake_intersection.Y += d; - else - fake_intersection.Y -= d; - - if (fake_intersection.Z < found_boxcenter.Z) - fake_intersection.Z += d; - else - fake_intersection.Z -= d; - - result.node_real_undersurface = floatToInt(fake_intersection, BS); - result.node_abovesurface = result.node_real_undersurface - + result.intersection_normal; - } - return result; -} - -#endif // #ifndef SERVER diff --git a/src/environment.h b/src/environment.h index 84805b462..209d795d8 100644 --- a/src/environment.h +++ b/src/environment.h @@ -50,7 +50,6 @@ class ITextureSource; class IGameDef; class Map; class ServerMap; -class ClientMap; class GameScripting; class Player; class RemotePlayer; @@ -525,171 +524,5 @@ private: UNORDERED_MAP m_particle_spawner_attachments; }; -#ifndef SERVER - -#include "clientobject.h" -#include "content_cao.h" - -class ClientSimpleObject; - -/* - The client-side environment. - - This is not thread-safe. - Must be called from main (irrlicht) thread (uses the SceneManager) - Client uses an environment mutex. -*/ - -enum ClientEnvEventType -{ - CEE_NONE, - CEE_PLAYER_DAMAGE, - CEE_PLAYER_BREATH -}; - -struct ClientEnvEvent -{ - ClientEnvEventType type; - union { - //struct{ - //} none; - struct{ - u8 amount; - bool send_to_server; - } player_damage; - struct{ - u16 amount; - } player_breath; - }; -}; - -class ClientEnvironment : public Environment -{ -public: - ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, - IrrlichtDevice *device); - ~ClientEnvironment(); - - Map & getMap(); - ClientMap & getClientMap(); - - IGameDef *getGameDef() - { return m_gamedef; } - - void step(f32 dtime); - - virtual void setLocalPlayer(LocalPlayer *player); - LocalPlayer *getLocalPlayer() { return m_local_player; } - - /* - ClientSimpleObjects - */ - - void addSimpleObject(ClientSimpleObject *simple); - - /* - ActiveObjects - */ - - GenericCAO* getGenericCAO(u16 id); - ClientActiveObject* getActiveObject(u16 id); - - /* - Adds an active object to the environment. - Environment handles deletion of object. - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObject(ClientActiveObject *object); - - void addActiveObject(u16 id, u8 type, const std::string &init_data); - void removeActiveObject(u16 id); - - void processActiveObjectMessage(u16 id, const std::string &data); - - /* - Callbacks for activeobjects - */ - - void damageLocalPlayer(u8 damage, bool handle_hp=true); - void updateLocalPlayerBreath(u16 breath); - - /* - Client likes to call these - */ - - // Get all nearby objects - void getActiveObjects(v3f origin, f32 max_d, - std::vector &dest); - - // Get event from queue. CEE_NONE is returned if queue is empty. - ClientEnvEvent getClientEvent(); - - /*! - * Gets closest object pointed by the shootline. - * Returns NULL if not found. - * - * \param[in] shootline_on_map the shootline for - * the test in world coordinates - * \param[out] intersection_point the first point where - * the shootline meets the object. Valid only if - * not NULL is returned. - * \param[out] intersection_normal the normal vector of - * the intersection, pointing outwards. Zero vector if - * the shootline starts in an active object. - * Valid only if not NULL is returned. - */ - ClientActiveObject * getSelectedActiveObject( - const core::line3d &shootline_on_map, - v3f *intersection_point, - v3s16 *intersection_normal - ); - - /*! - * Performs a raycast on the world. - * Returns the first thing the shootline meets. - * - * @param[in] shootline the shootline, starting from - * the camera position. This also gives the maximal distance - * of the search. - * @param[in] liquids_pointable if false, liquids are ignored - * @param[in] look_for_object if false, objects are ignored - */ - PointedThing getPointedThing( - core::line3d shootline, - bool liquids_pointable, - bool look_for_object); - - u16 attachement_parent_ids[USHRT_MAX + 1]; - - const std::list &getPlayerNames() { return m_player_names; } - void addPlayerName(const std::string &name) { m_player_names.push_back(name); } - void removePlayerName(const std::string &name) { m_player_names.remove(name); } - void updateCameraOffset(v3s16 camera_offset) - { m_camera_offset = camera_offset; } - v3s16 getCameraOffset() const { return m_camera_offset; } -private: - ClientMap *m_map; - LocalPlayer *m_local_player; - scene::ISceneManager *m_smgr; - ITextureSource *m_texturesource; - IGameDef *m_gamedef; - IrrlichtDevice *m_irr; - UNORDERED_MAP m_active_objects; - std::vector m_simple_objects; - std::queue m_client_event_queue; - IntervalLimiter m_active_object_light_update_interval; - IntervalLimiter m_lava_hurt_interval; - IntervalLimiter m_drowning_interval; - IntervalLimiter m_breathing_interval; - std::list m_player_names; - v3s16 m_camera_offset; -}; - -#endif - #endif From 98e36d7d681abc508aa81b6f9df0c8c87c7cfe17 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sun, 8 Jan 2017 11:01:35 +0100 Subject: [PATCH 037/586] Move ServerEnvironment to dedicated cpp/header files * also cleanup some unneeded inclusions --- src/CMakeLists.txt | 1 + src/clientiface.cpp | 2 +- src/collision.cpp | 1 + src/environment.cpp | 2149 --------------------------- src/environment.h | 397 ----- src/inventorymanager.cpp | 2 +- src/pathfinder.cpp | 2 +- src/script/lua_api/l_env.h | 2 +- src/script/lua_api/l_nodemeta.cpp | 2 +- src/script/lua_api/l_nodetimer.cpp | 2 +- src/server.h | 2 +- src/serverenvironment.cpp | 2167 ++++++++++++++++++++++++++++ src/serverenvironment.h | 423 ++++++ src/treegen.cpp | 3 +- 14 files changed, 2600 insertions(+), 2555 deletions(-) create mode 100644 src/serverenvironment.cpp create mode 100644 src/serverenvironment.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5228eb9ac..f90542be9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -452,6 +452,7 @@ set(common_SRCS rollback_interface.cpp serialization.cpp server.cpp + serverenvironment.cpp serverlist.cpp serverobject.cpp settings.cpp diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 0390cf0ff..1610c21fd 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "mapblock.h" #include "network/connection.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" #include "emerge.h" #include "content_sao.h" // TODO this is used for cleanup of only diff --git a/src/collision.cpp b/src/collision.cpp index 21f14bec1..595fa8059 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "gamedef.h" #include "clientenvironment.h" +#include "serverenvironment.h" #include "serverobject.h" #include "profiler.h" diff --git a/src/environment.cpp b/src/environment.cpp index 6f6e20238..8c1aad9d3 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -19,35 +19,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "environment.h" -#include "filesys.h" -#include "porting.h" #include "collision.h" -#include "content_mapnode.h" -#include "mapblock.h" #include "serverobject.h" -#include "content_sao.h" -#include "settings.h" -#include "log.h" -#include "profiler.h" #include "scripting_game.h" -#include "nodedef.h" -#include "nodemetadata.h" -#include "gamedef.h" #include "server.h" #include "daynightratio.h" -#include "map.h" #include "emerge.h" -#include "raycast.h" -#include "voxelalgorithms.h" -#include "util/serialize.h" -#include "util/basic_macros.h" -#include "util/pointedthing.h" -#include "threading/mutex_auto_lock.h" - -#define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" - -// A number that is much smaller than the timeout for particle spawners should/could ever be -#define PARTICLE_SPAWNER_NO_EXPIRY -1024.f Environment::Environment(): m_time_of_day_speed(0), @@ -147,2129 +124,3 @@ u32 Environment::getDayCount() // Atomic counter return m_day_count; } - - -/* - ABMWithState -*/ - -ABMWithState::ABMWithState(ActiveBlockModifier *abm_): - abm(abm_), - timer(0) -{ - // Initialize timer to random value to spread processing - float itv = abm->getTriggerInterval(); - itv = MYMAX(0.001, itv); // No less than 1ms - int minval = MYMAX(-0.51*itv, -60); // Clamp to - int maxval = MYMIN(0.51*itv, 60); // +-60 seconds - timer = myrand_range(minval, maxval); -} - -/* - LBMManager -*/ - -void LBMContentMapping::deleteContents() -{ - for (std::vector::iterator it = lbm_list.begin(); - it != lbm_list.end(); ++it) { - delete *it; - } -} - -void LBMContentMapping::addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef) -{ - // Add the lbm_def to the LBMContentMapping. - // Unknown names get added to the global NameIdMapping. - INodeDefManager *nodedef = gamedef->ndef(); - - lbm_list.push_back(lbm_def); - - for (std::set::const_iterator it = lbm_def->trigger_contents.begin(); - it != lbm_def->trigger_contents.end(); ++it) { - std::set c_ids; - bool found = nodedef->getIds(*it, c_ids); - if (!found) { - content_t c_id = gamedef->allocateUnknownNodeId(*it); - if (c_id == CONTENT_IGNORE) { - // Seems it can't be allocated. - warningstream << "Could not internalize node name \"" << *it - << "\" while loading LBM \"" << lbm_def->name << "\"." << std::endl; - continue; - } - c_ids.insert(c_id); - } - - for (std::set::const_iterator iit = - c_ids.begin(); iit != c_ids.end(); ++iit) { - content_t c_id = *iit; - map[c_id].push_back(lbm_def); - } - } -} - -const std::vector * - LBMContentMapping::lookup(content_t c) const -{ - container_map::const_iterator it = map.find(c); - if (it == map.end()) - return NULL; - // This first dereferences the iterator, returning - // a std::vector - // reference, then we convert it to a pointer. - return &(it->second); -} - -LBMManager::~LBMManager() -{ - for (std::map::iterator it = - m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { - delete it->second; - } - for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); - it != m_lbm_lookup.end(); ++it) { - (it->second).deleteContents(); - } -} - -void LBMManager::addLBMDef(LoadingBlockModifierDef *lbm_def) -{ - // Precondition, in query mode the map isn't used anymore - FATAL_ERROR_IF(m_query_mode == true, - "attempted to modify LBMManager in query mode"); - - if (!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) { - throw ModError("Error adding LBM \"" + lbm_def->name + - "\": Does not follow naming conventions: " - "Only chararacters [a-z0-9_:] are allowed."); - } - - m_lbm_defs[lbm_def->name] = lbm_def; -} - -void LBMManager::loadIntroductionTimes(const std::string ×, - IGameDef *gamedef, u32 now) -{ - m_query_mode = true; - - // name -> time map. - // Storing it in a map first instead of - // handling the stuff directly in the loop - // removes all duplicate entries. - // TODO make this std::unordered_map - std::map introduction_times; - - /* - The introduction times string consists of name~time entries, - with each entry terminated by a semicolon. The time is decimal. - */ - - size_t idx = 0; - size_t idx_new; - while ((idx_new = times.find(";", idx)) != std::string::npos) { - std::string entry = times.substr(idx, idx_new - idx); - std::vector components = str_split(entry, '~'); - if (components.size() != 2) - throw SerializationError("Introduction times entry \"" - + entry + "\" requires exactly one '~'!"); - const std::string &name = components[0]; - u32 time = from_string(components[1]); - introduction_times[name] = time; - idx = idx_new + 1; - } - - // Put stuff from introduction_times into m_lbm_lookup - for (std::map::const_iterator it = introduction_times.begin(); - it != introduction_times.end(); ++it) { - const std::string &name = it->first; - u32 time = it->second; - - std::map::iterator def_it = - m_lbm_defs.find(name); - if (def_it == m_lbm_defs.end()) { - // This seems to be an LBM entry for - // an LBM we haven't loaded. Discard it. - continue; - } - LoadingBlockModifierDef *lbm_def = def_it->second; - if (lbm_def->run_at_every_load) { - // This seems to be an LBM entry for - // an LBM that runs at every load. - // Don't add it just yet. - continue; - } - - m_lbm_lookup[time].addLBM(lbm_def, gamedef); - - // Erase the entry so that we know later - // what elements didn't get put into m_lbm_lookup - m_lbm_defs.erase(name); - } - - // Now also add the elements from m_lbm_defs to m_lbm_lookup - // that weren't added in the previous step. - // They are introduced first time to this world, - // or are run at every load (introducement time hardcoded to U32_MAX). - - LBMContentMapping &lbms_we_introduce_now = m_lbm_lookup[now]; - LBMContentMapping &lbms_running_always = m_lbm_lookup[U32_MAX]; - - for (std::map::iterator it = - m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { - if (it->second->run_at_every_load) { - lbms_running_always.addLBM(it->second, gamedef); - } else { - lbms_we_introduce_now.addLBM(it->second, gamedef); - } - } - - // Clear the list, so that we don't delete remaining elements - // twice in the destructor - m_lbm_defs.clear(); -} - -std::string LBMManager::createIntroductionTimesString() -{ - // Precondition, we must be in query mode - FATAL_ERROR_IF(m_query_mode == false, - "attempted to query on non fully set up LBMManager"); - - std::ostringstream oss; - for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); - it != m_lbm_lookup.end(); ++it) { - u32 time = it->first; - std::vector &lbm_list = it->second.lbm_list; - for (std::vector::iterator iit = lbm_list.begin(); - iit != lbm_list.end(); ++iit) { - // Don't add if the LBM runs at every load, - // then introducement time is hardcoded - // and doesn't need to be stored - if ((*iit)->run_at_every_load) - continue; - oss << (*iit)->name << "~" << time << ";"; - } - } - return oss.str(); -} - -void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp) -{ - // Precondition, we need m_lbm_lookup to be initialized - FATAL_ERROR_IF(m_query_mode == false, - "attempted to query on non fully set up LBMManager"); - v3s16 pos_of_block = block->getPosRelative(); - v3s16 pos; - MapNode n; - content_t c; - lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp); - for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++) - for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++) - for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) - { - n = block->getNodeNoEx(pos); - c = n.getContent(); - for (LBMManager::lbm_lookup_map::const_iterator iit = it; - iit != m_lbm_lookup.end(); ++iit) { - const std::vector *lbm_list = - iit->second.lookup(c); - if (!lbm_list) - continue; - for (std::vector::const_iterator iit = - lbm_list->begin(); iit != lbm_list->end(); ++iit) { - (*iit)->trigger(env, pos + pos_of_block, n); - } - } - } -} - -/* - ActiveBlockList -*/ - -void fillRadiusBlock(v3s16 p0, s16 r, std::set &list) -{ - v3s16 p; - for(p.X=p0.X-r; p.X<=p0.X+r; p.X++) - for(p.Y=p0.Y-r; p.Y<=p0.Y+r; p.Y++) - for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) - { - // limit to a sphere - if (p.getDistanceFrom(p0) <= r) { - // Set in list - list.insert(p); - } - } -} - -void ActiveBlockList::update(std::vector &active_positions, - s16 radius, - std::set &blocks_removed, - std::set &blocks_added) -{ - /* - Create the new list - */ - std::set newlist = m_forceloaded_list; - for(std::vector::iterator i = active_positions.begin(); - i != active_positions.end(); ++i) - { - fillRadiusBlock(*i, radius, newlist); - } - - /* - Find out which blocks on the old list are not on the new list - */ - // Go through old list - for(std::set::iterator i = m_list.begin(); - i != m_list.end(); ++i) - { - v3s16 p = *i; - // If not on new list, it's been removed - if(newlist.find(p) == newlist.end()) - blocks_removed.insert(p); - } - - /* - Find out which blocks on the new list are not on the old list - */ - // Go through new list - for(std::set::iterator i = newlist.begin(); - i != newlist.end(); ++i) - { - v3s16 p = *i; - // If not on old list, it's been added - if(m_list.find(p) == m_list.end()) - blocks_added.insert(p); - } - - /* - Update m_list - */ - m_list.clear(); - for(std::set::iterator i = newlist.begin(); - i != newlist.end(); ++i) - { - v3s16 p = *i; - m_list.insert(p); - } -} - -/* - ServerEnvironment -*/ - -ServerEnvironment::ServerEnvironment(ServerMap *map, - GameScripting *scriptIface, IGameDef *gamedef, - const std::string &path_world) : - m_map(map), - m_script(scriptIface), - m_gamedef(gamedef), - m_path_world(path_world), - m_send_recommended_timer(0), - m_active_block_interval_overload_skip(0), - m_game_time(0), - m_game_time_fraction_counter(0), - m_last_clear_objects_time(0), - m_recommended_send_interval(0.1), - m_max_lag_estimate(0.1) -{ -} - -ServerEnvironment::~ServerEnvironment() -{ - // Clear active block list. - // This makes the next one delete all active objects. - m_active_blocks.clear(); - - // Convert all objects to static and delete the active objects - deactivateFarObjects(true); - - // Drop/delete map - m_map->drop(); - - // Delete ActiveBlockModifiers - for (std::vector::iterator - i = m_abms.begin(); i != m_abms.end(); ++i){ - delete i->abm; - } - - // Deallocate players - for (std::vector::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - delete (*i); - } -} - -Map & ServerEnvironment::getMap() -{ - return *m_map; -} - -ServerMap & ServerEnvironment::getServerMap() -{ - return *m_map; -} - -RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id) -{ - for (std::vector::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = *i; - if (player->peer_id == peer_id) - return player; - } - return NULL; -} - -RemotePlayer *ServerEnvironment::getPlayer(const char* name) -{ - for (std::vector::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = *i; - if (strcmp(player->getName(), name) == 0) - return player; - } - return NULL; -} - -void ServerEnvironment::addPlayer(RemotePlayer *player) -{ - DSTACK(FUNCTION_NAME); - /* - Check that peer_ids are unique. - Also check that names are unique. - Exception: there can be multiple players with peer_id=0 - */ - // If peer id is non-zero, it has to be unique. - if (player->peer_id != 0) - FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique"); - // Name has to be unique. - FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique"); - // Add. - m_players.push_back(player); -} - -void ServerEnvironment::removePlayer(RemotePlayer *player) -{ - for (std::vector::iterator it = m_players.begin(); - it != m_players.end(); ++it) { - if ((*it) == player) { - delete *it; - m_players.erase(it); - return; - } - } -} - -bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p) -{ - float distance = pos1.getDistanceFrom(pos2); - - //calculate normalized direction vector - v3f normalized_vector = v3f((pos2.X - pos1.X)/distance, - (pos2.Y - pos1.Y)/distance, - (pos2.Z - pos1.Z)/distance); - - //find out if there's a node on path between pos1 and pos2 - for (float i = 1; i < distance; i += stepsize) { - v3s16 pos = floatToInt(v3f(normalized_vector.X * i, - normalized_vector.Y * i, - normalized_vector.Z * i) +pos1,BS); - - MapNode n = getMap().getNodeNoEx(pos); - - if(n.param0 != CONTENT_AIR) { - if (p) { - *p = pos; - } - return false; - } - } - return true; -} - -void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, - const std::string &str_reason, bool reconnect) -{ - for (std::vector::iterator it = m_players.begin(); - it != m_players.end(); ++it) { - RemotePlayer *player = dynamic_cast(*it); - ((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id, - player->protocol_version, reason, str_reason, reconnect); - } -} - -void ServerEnvironment::saveLoadedPlayers() -{ - std::string players_path = m_path_world + DIR_DELIM "players"; - fs::CreateDir(players_path); - - for (std::vector::iterator it = m_players.begin(); - it != m_players.end(); - ++it) { - if ((*it)->checkModified()) { - (*it)->save(players_path, m_gamedef); - } - } -} - -void ServerEnvironment::savePlayer(RemotePlayer *player) -{ - std::string players_path = m_path_world + DIR_DELIM "players"; - fs::CreateDir(players_path); - - player->save(players_path, m_gamedef); -} - -RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao) -{ - bool newplayer = false; - bool found = false; - std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM; - std::string path = players_path + playername; - - RemotePlayer *player = getPlayer(playername.c_str()); - if (!player) { - player = new RemotePlayer("", m_gamedef->idef()); - newplayer = true; - } - - for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { - //// Open file and deserialize - std::ifstream is(path.c_str(), std::ios_base::binary); - if (!is.good()) - continue; - - player->deSerialize(is, path, sao); - is.close(); - - if (player->getName() == playername) { - found = true; - break; - } - - path = players_path + playername + itos(i); - } - - if (!found) { - infostream << "Player file for player " << playername - << " not found" << std::endl; - if (newplayer) - delete player; - - return NULL; - } - - if (newplayer) { - addPlayer(player); - } - player->setModified(false); - return player; -} - -void ServerEnvironment::saveMeta() -{ - std::string path = m_path_world + DIR_DELIM "env_meta.txt"; - - // Open file and serialize - std::ostringstream ss(std::ios_base::binary); - - Settings args; - args.setU64("game_time", m_game_time); - args.setU64("time_of_day", getTimeOfDay()); - args.setU64("last_clear_objects_time", m_last_clear_objects_time); - args.setU64("lbm_introduction_times_version", 1); - args.set("lbm_introduction_times", - m_lbm_mgr.createIntroductionTimesString()); - args.setU64("day_count", m_day_count); - args.writeLines(ss); - ss<<"EnvArgsEnd\n"; - - if(!fs::safeWriteToFile(path, ss.str())) - { - infostream<<"ServerEnvironment::saveMeta(): Failed to write " - < required_neighbors; -}; - -class ABMHandler -{ -private: - ServerEnvironment *m_env; - std::vector *> m_aabms; -public: - ABMHandler(std::vector &abms, - float dtime_s, ServerEnvironment *env, - bool use_timers): - m_env(env) - { - if(dtime_s < 0.001) - return; - INodeDefManager *ndef = env->getGameDef()->ndef(); - for(std::vector::iterator - i = abms.begin(); i != abms.end(); ++i) { - ActiveBlockModifier *abm = i->abm; - float trigger_interval = abm->getTriggerInterval(); - if(trigger_interval < 0.001) - trigger_interval = 0.001; - float actual_interval = dtime_s; - if(use_timers){ - i->timer += dtime_s; - if(i->timer < trigger_interval) - continue; - i->timer -= trigger_interval; - actual_interval = trigger_interval; - } - float chance = abm->getTriggerChance(); - if(chance == 0) - chance = 1; - ActiveABM aabm; - aabm.abm = abm; - if(abm->getSimpleCatchUp()) { - float intervals = actual_interval / trigger_interval; - if(intervals == 0) - continue; - aabm.chance = chance / intervals; - if(aabm.chance == 0) - aabm.chance = 1; - } else { - aabm.chance = chance; - } - // Trigger neighbors - std::set required_neighbors_s - = abm->getRequiredNeighbors(); - for(std::set::iterator - i = required_neighbors_s.begin(); - i != required_neighbors_s.end(); ++i) - { - ndef->getIds(*i, aabm.required_neighbors); - } - // Trigger contents - std::set contents_s = abm->getTriggerContents(); - for(std::set::iterator - i = contents_s.begin(); i != contents_s.end(); ++i) - { - std::set ids; - ndef->getIds(*i, ids); - for(std::set::const_iterator k = ids.begin(); - k != ids.end(); ++k) - { - content_t c = *k; - if (c >= m_aabms.size()) - m_aabms.resize(c + 256, NULL); - if (!m_aabms[c]) - m_aabms[c] = new std::vector; - m_aabms[c]->push_back(aabm); - } - } - } - } - - ~ABMHandler() - { - for (size_t i = 0; i < m_aabms.size(); i++) - delete m_aabms[i]; - } - - // Find out how many objects the given block and its neighbours contain. - // Returns the number of objects in the block, and also in 'wider' the - // number of objects in the block and all its neighbours. The latter - // may an estimate if any neighbours are unloaded. - u32 countObjects(MapBlock *block, ServerMap * map, u32 &wider) - { - wider = 0; - u32 wider_unknown_count = 0; - for(s16 x=-1; x<=1; x++) - for(s16 y=-1; y<=1; y++) - for(s16 z=-1; z<=1; z++) - { - MapBlock *block2 = map->getBlockNoCreateNoEx( - block->getPos() + v3s16(x,y,z)); - if(block2==NULL){ - wider_unknown_count++; - continue; - } - wider += block2->m_static_objects.m_active.size() - + block2->m_static_objects.m_stored.size(); - } - // Extrapolate - u32 active_object_count = block->m_static_objects.m_active.size(); - u32 wider_known_count = 3*3*3 - wider_unknown_count; - wider += wider_unknown_count * wider / wider_known_count; - return active_object_count; - - } - void apply(MapBlock *block) - { - if(m_aabms.empty() || block->isDummy()) - return; - - ServerMap *map = &m_env->getServerMap(); - - u32 active_object_count_wider; - u32 active_object_count = this->countObjects(block, map, active_object_count_wider); - m_env->m_added_objects = 0; - - v3s16 p0; - for(p0.X=0; p0.XgetNodeUnsafe(p0); - content_t c = n.getContent(); - - if (c >= m_aabms.size() || !m_aabms[c]) - continue; - - v3s16 p = p0 + block->getPosRelative(); - for(std::vector::iterator - i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { - if(myrand() % i->chance != 0) - continue; - - // Check neighbors - if(!i->required_neighbors.empty()) - { - v3s16 p1; - for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) - for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) - for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) - { - if(p1 == p0) - continue; - content_t c; - if (block->isValidPosition(p1)) { - // if the neighbor is found on the same map block - // get it straight from there - const MapNode &n = block->getNodeUnsafe(p1); - c = n.getContent(); - } else { - // otherwise consult the map - MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); - c = n.getContent(); - } - std::set::const_iterator k; - k = i->required_neighbors.find(c); - if(k != i->required_neighbors.end()){ - goto neighbor_found; - } - } - // No required neighbor found - continue; - } -neighbor_found: - - // Call all the trigger variations - i->abm->trigger(m_env, p, n); - i->abm->trigger(m_env, p, n, - active_object_count, active_object_count_wider); - - // Count surrounding objects again if the abms added any - if(m_env->m_added_objects > 0) { - active_object_count = countObjects(block, map, active_object_count_wider); - m_env->m_added_objects = 0; - } - } - } - } -}; - -void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) -{ - // Reset usage timer immediately, otherwise a block that becomes active - // again at around the same time as it would normally be unloaded will - // get unloaded incorrectly. (I think this still leaves a small possibility - // of a race condition between this and server::AsyncRunStep, which only - // some kind of synchronisation will fix, but it at least reduces the window - // of opportunity for it to break from seconds to nanoseconds) - block->resetUsageTimer(); - - // Get time difference - u32 dtime_s = 0; - u32 stamp = block->getTimestamp(); - if (m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) - dtime_s = m_game_time - stamp; - dtime_s += additional_dtime; - - /*infostream<<"ServerEnvironment::activateBlock(): block timestamp: " - <m_static_objects.m_stored.clear(); - // do not set changed flag to avoid unnecessary mapblock writes - } - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - - /*infostream<<"ServerEnvironment::activateBlock(): block is " - < elapsed_timers = - block->m_node_timers.step((float)dtime_s); - if (!elapsed_timers.empty()) { - MapNode n; - for (std::vector::iterator - i = elapsed_timers.begin(); - i != elapsed_timers.end(); ++i){ - n = block->getNodeNoEx(i->position); - v3s16 p = i->position + block->getPosRelative(); - if (m_script->node_on_timer(p, n, i->elapsed)) - block->setNodeTimer(NodeTimer(i->timeout, 0, i->position)); - } - } - - /* Handle ActiveBlockModifiers */ - ABMHandler abmhandler(m_abms, dtime_s, this, false); - abmhandler.apply(block); -} - -void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm) -{ - m_abms.push_back(ABMWithState(abm)); -} - -void ServerEnvironment::addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm) -{ - m_lbm_mgr.addLBMDef(lbm); -} - -bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) -{ - INodeDefManager *ndef = m_gamedef->ndef(); - MapNode n_old = m_map->getNodeNoEx(p); - - // Call destructor - if (ndef->get(n_old).has_on_destruct) - m_script->node_on_destruct(p, n_old); - - // Replace node - if (!m_map->addNodeWithEvent(p, n)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - // Call post-destructor - if (ndef->get(n_old).has_after_destruct) - m_script->node_after_destruct(p, n_old); - - // Call constructor - if (ndef->get(n).has_on_construct) - m_script->node_on_construct(p, n); - - return true; -} - -bool ServerEnvironment::removeNode(v3s16 p) -{ - INodeDefManager *ndef = m_gamedef->ndef(); - MapNode n_old = m_map->getNodeNoEx(p); - - // Call destructor - if (ndef->get(n_old).has_on_destruct) - m_script->node_on_destruct(p, n_old); - - // Replace with air - // This is slightly optimized compared to addNodeWithEvent(air) - if (!m_map->removeNodeWithEvent(p)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - // Call post-destructor - if (ndef->get(n_old).has_after_destruct) - m_script->node_after_destruct(p, n_old); - - // Air doesn't require constructor - return true; -} - -bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) -{ - if (!m_map->addNodeWithEvent(p, n, false)) - return false; - - // Update active VoxelManipulator if a mapgen thread - m_map->updateVManip(p); - - return true; -} - -void ServerEnvironment::getObjectsInsideRadius(std::vector &objects, v3f pos, float radius) -{ - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - u16 id = i->first; - v3f objectpos = obj->getBasePosition(); - if (objectpos.getDistanceFrom(pos) > radius) - continue; - objects.push_back(id); - } -} - -void ServerEnvironment::clearObjects(ClearObjectsMode mode) -{ - infostream << "ServerEnvironment::clearObjects(): " - << "Removing all active objects" << std::endl; - std::vector objects_to_remove; - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) - continue; - u16 id = i->first; - // Delete static object if block is loaded - if (obj->m_static_exists) { - MapBlock *block = m_map->getBlockNoCreateNoEx(obj->m_static_block); - if (block) { - block->m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_CLEAR_ALL_OBJECTS); - obj->m_static_exists = false; - } - } - // If known by some client, don't delete immediately - if (obj->m_known_by_count > 0) { - obj->m_pending_deactivation = true; - obj->m_removed = true; - continue; - } - - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete active object - if (obj->environmentDeletes()) - delete obj; - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - - // Remove references from m_active_objects - for (std::vector::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } - - // Get list of loaded blocks - std::vector loaded_blocks; - infostream << "ServerEnvironment::clearObjects(): " - << "Listing all loaded blocks" << std::endl; - m_map->listAllLoadedBlocks(loaded_blocks); - infostream << "ServerEnvironment::clearObjects(): " - << "Done listing all loaded blocks: " - << loaded_blocks.size()< loadable_blocks; - if (mode == CLEAR_OBJECTS_MODE_FULL) { - infostream << "ServerEnvironment::clearObjects(): " - << "Listing all loadable blocks" << std::endl; - m_map->listAllLoadableBlocks(loadable_blocks); - infostream << "ServerEnvironment::clearObjects(): " - << "Done listing all loadable blocks: " - << loadable_blocks.size() << std::endl; - } else { - loadable_blocks = loaded_blocks; - } - - infostream << "ServerEnvironment::clearObjects(): " - << "Now clearing objects in " << loadable_blocks.size() - << " blocks" << std::endl; - - // Grab a reference on each loaded block to avoid unloading it - for (std::vector::iterator i = loaded_blocks.begin(); - i != loaded_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - assert(block != NULL); - block->refGrab(); - } - - // Remove objects in all loadable blocks - u32 unload_interval = U32_MAX; - if (mode == CLEAR_OBJECTS_MODE_FULL) { - unload_interval = g_settings->getS32("max_clearobjects_extra_loaded_blocks"); - unload_interval = MYMAX(unload_interval, 1); - } - u32 report_interval = loadable_blocks.size() / 10; - u32 num_blocks_checked = 0; - u32 num_blocks_cleared = 0; - u32 num_objs_cleared = 0; - for (std::vector::iterator i = loadable_blocks.begin(); - i != loadable_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->emergeBlock(p, false); - if (!block) { - errorstream << "ServerEnvironment::clearObjects(): " - << "Failed to emerge block " << PP(p) << std::endl; - continue; - } - u32 num_stored = block->m_static_objects.m_stored.size(); - u32 num_active = block->m_static_objects.m_active.size(); - if (num_stored != 0 || num_active != 0) { - block->m_static_objects.m_stored.clear(); - block->m_static_objects.m_active.clear(); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_CLEAR_ALL_OBJECTS); - num_objs_cleared += num_stored + num_active; - num_blocks_cleared++; - } - num_blocks_checked++; - - if (report_interval != 0 && - num_blocks_checked % report_interval == 0) { - float percent = 100.0 * (float)num_blocks_checked / - loadable_blocks.size(); - infostream << "ServerEnvironment::clearObjects(): " - << "Cleared " << num_objs_cleared << " objects" - << " in " << num_blocks_cleared << " blocks (" - << percent << "%)" << std::endl; - } - if (num_blocks_checked % unload_interval == 0) { - m_map->unloadUnreferencedBlocks(); - } - } - m_map->unloadUnreferencedBlocks(); - - // Drop references that were added above - for (std::vector::iterator i = loaded_blocks.begin(); - i != loaded_blocks.end(); ++i) { - v3s16 p = *i; - MapBlock *block = m_map->getBlockNoCreateNoEx(p); - assert(block); - block->refDrop(); - } - - m_last_clear_objects_time = m_game_time; - - infostream << "ServerEnvironment::clearObjects(): " - << "Finished: Cleared " << num_objs_cleared << " objects" - << " in " << num_blocks_cleared << " blocks" << std::endl; -} - -void ServerEnvironment::step(float dtime) -{ - DSTACK(FUNCTION_NAME); - - //TimeTaker timer("ServerEnv step"); - - /* Step time of day */ - stepTimeOfDay(dtime); - - // Update this one - // NOTE: This is kind of funny on a singleplayer game, but doesn't - // really matter that much. - static const float server_step = g_settings->getFloat("dedicated_server_step"); - m_recommended_send_interval = server_step; - - /* - Increment game time - */ - { - m_game_time_fraction_counter += dtime; - u32 inc_i = (u32)m_game_time_fraction_counter; - m_game_time += inc_i; - m_game_time_fraction_counter -= (float)inc_i; - } - - /* - Handle players - */ - { - ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG); - for (std::vector::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = dynamic_cast(*i); - assert(player); - - // Ignore disconnected players - if(player->peer_id == 0) - continue; - - // Move - player->move(dtime, this, 100*BS); - } - } - - /* - Manage active block list - */ - if (m_active_blocks_management_interval.step(dtime, m_cache_active_block_mgmt_interval)) { - ScopeProfiler sp(g_profiler, "SEnv: manage act. block list avg per interval", SPT_AVG); - /* - Get player block positions - */ - std::vector players_blockpos; - for (std::vector::iterator i = m_players.begin(); - i != m_players.end(); ++i) { - RemotePlayer *player = dynamic_cast(*i); - assert(player); - - // Ignore disconnected players - if (player->peer_id == 0) - continue; - - PlayerSAO *playersao = player->getPlayerSAO(); - assert(playersao); - - v3s16 blockpos = getNodeBlockPos( - floatToInt(playersao->getBasePosition(), BS)); - players_blockpos.push_back(blockpos); - } - - /* - Update list of active blocks, collecting changes - */ - static const s16 active_block_range = g_settings->getS16("active_block_range"); - std::set blocks_removed; - std::set blocks_added; - m_active_blocks.update(players_blockpos, active_block_range, - blocks_removed, blocks_added); - - /* - Handle removed blocks - */ - - // Convert active objects that are no more in active blocks to static - deactivateFarObjects(false); - - for(std::set::iterator - i = blocks_removed.begin(); - i != blocks_removed.end(); ++i) { - v3s16 p = *i; - - /* infostream<<"Server: Block " << PP(p) - << " became inactive"<getBlockNoCreateNoEx(p); - if(block==NULL) - continue; - - // Set current time as timestamp (and let it set ChangedFlag) - block->setTimestamp(m_game_time); - } - - /* - Handle added blocks - */ - - for(std::set::iterator - i = blocks_added.begin(); - i != blocks_added.end(); ++i) - { - v3s16 p = *i; - - MapBlock *block = m_map->getBlockOrEmerge(p); - if(block==NULL){ - m_active_blocks.m_list.erase(p); - continue; - } - - activateBlock(block); - /* infostream<<"Server: Block " << PP(p) - << " became active"<::iterator - i = m_active_blocks.m_list.begin(); - i != m_active_blocks.m_list.end(); ++i) - { - v3s16 p = *i; - - /*infostream<<"Server: Block ("<getBlockNoCreateNoEx(p); - if(block==NULL) - continue; - - // Reset block usage timer - block->resetUsageTimer(); - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - // If time has changed much from the one on disk, - // set block to be saved when it is unloaded - if(block->getTimestamp() > block->getDiskTimestamp() + 60) - block->raiseModified(MOD_STATE_WRITE_AT_UNLOAD, - MOD_REASON_BLOCK_EXPIRED); - - // Run node timers - std::vector elapsed_timers = - block->m_node_timers.step((float)dtime); - if (!elapsed_timers.empty()) { - MapNode n; - for (std::vector::iterator i = elapsed_timers.begin(); - i != elapsed_timers.end(); ++i) { - n = block->getNodeNoEx(i->position); - p = i->position + block->getPosRelative(); - if (m_script->node_on_timer(p, n, i->elapsed)) { - block->setNodeTimer(NodeTimer( - i->timeout, 0, i->position)); - } - } - } - } - } - - if (m_active_block_modifier_interval.step(dtime, m_cache_abm_interval)) - do{ // breakable - if(m_active_block_interval_overload_skip > 0){ - ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips"); - m_active_block_interval_overload_skip--; - break; - } - ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg per interval", SPT_AVG); - TimeTaker timer("modify in active blocks per interval"); - - // Initialize handling of ActiveBlockModifiers - ABMHandler abmhandler(m_abms, m_cache_abm_interval, this, true); - - for(std::set::iterator - i = m_active_blocks.m_list.begin(); - i != m_active_blocks.m_list.end(); ++i) - { - v3s16 p = *i; - - /*infostream<<"Server: Block ("<getBlockNoCreateNoEx(p); - if(block == NULL) - continue; - - // Set current time as timestamp - block->setTimestampNoChangedFlag(m_game_time); - - /* Handle ActiveBlockModifiers */ - abmhandler.apply(block); - } - - u32 time_ms = timer.stop(true); - u32 max_time_ms = 200; - if(time_ms > max_time_ms){ - warningstream<<"active block modifiers took " - <environment_Step(dtime); - - /* - Step active objects - */ - { - ScopeProfiler sp(g_profiler, "SEnv: step act. objs avg", SPT_AVG); - //TimeTaker timer("Step active objects"); - - g_profiler->avg("SEnv: num of objects", m_active_objects.size()); - - // This helps the objects to send data at the same time - bool send_recommended = false; - m_send_recommended_timer += dtime; - if(m_send_recommended_timer > getSendRecommendedInterval()) - { - m_send_recommended_timer -= getSendRecommendedInterval(); - send_recommended = true; - } - - for(ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - ServerActiveObject* obj = i->second; - // Don't step if is to be removed or stored statically - if(obj->m_removed || obj->m_pending_deactivation) - continue; - // Step object - obj->step(dtime, send_recommended); - // Read messages from object - while(!obj->m_messages_out.empty()) - { - m_active_object_messages.push( - obj->m_messages_out.front()); - obj->m_messages_out.pop(); - } - } - } - - /* - Manage active objects - */ - if(m_object_management_interval.step(dtime, 0.5)) - { - ScopeProfiler sp(g_profiler, "SEnv: remove removed objs avg /.5s", SPT_AVG); - /* - Remove objects that satisfy (m_removed && m_known_by_count==0) - */ - removeRemovedObjects(); - } - - /* - Manage particle spawner expiration - */ - if (m_particle_management_interval.step(dtime, 1.0)) { - for (UNORDERED_MAP::iterator i = m_particle_spawners.begin(); - i != m_particle_spawners.end(); ) { - //non expiring spawners - if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) { - ++i; - continue; - } - - i->second -= 1.0f; - if (i->second <= 0.f) - m_particle_spawners.erase(i++); - else - ++i; - } - } -} - -u32 ServerEnvironment::addParticleSpawner(float exptime) -{ - // Timers with lifetime 0 do not expire - float time = exptime > 0.f ? exptime : PARTICLE_SPAWNER_NO_EXPIRY; - - u32 id = 0; - for (;;) { // look for unused particlespawner id - id++; - UNORDERED_MAP::iterator f = m_particle_spawners.find(id); - if (f == m_particle_spawners.end()) { - m_particle_spawners[id] = time; - break; - } - } - return id; -} - -u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id) -{ - u32 id = addParticleSpawner(exptime); - m_particle_spawner_attachments[id] = attached_id; - if (ServerActiveObject *obj = getActiveObject(attached_id)) { - obj->attachParticleSpawner(id); - } - return id; -} - -void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object) -{ - m_particle_spawners.erase(id); - UNORDERED_MAP::iterator it = m_particle_spawner_attachments.find(id); - if (it != m_particle_spawner_attachments.end()) { - u16 obj_id = (*it).second; - ServerActiveObject *sao = getActiveObject(obj_id); - if (sao != NULL && remove_from_object) { - sao->detachParticleSpawner(id); - } - m_particle_spawner_attachments.erase(id); - } -} - -ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) -{ - ActiveObjectMap::iterator n = m_active_objects.find(id); - return (n != m_active_objects.end() ? n->second : NULL); -} - -bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects) -{ - if (id == 0) - return false; - - return objects.find(id) == objects.end(); -} - -u16 getFreeServerActiveObjectId(ActiveObjectMap &objects) -{ - //try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) - { - last_used_id ++; - if(isFreeServerActiveObjectId(last_used_id, objects)) - return last_used_id; - - if(last_used_id == startid) - return 0; - } -} - -u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) -{ - assert(object); // Pre-condition - m_added_objects++; - u16 id = addActiveObjectRaw(object, true, 0); - return id; -} - -/* - Finds out what new objects have been added to - inside a radius around a position -*/ -void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set ¤t_objects, - std::queue &added_objects) -{ - f32 radius_f = radius * BS; - f32 player_radius_f = player_radius * BS; - - if (player_radius_f < 0) - player_radius_f = 0; - /* - Go through the object list, - - discard m_removed objects, - - discard objects that are too far away, - - discard objects that are found in current_objects. - - add remaining objects to added_objects - */ - for (ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - u16 id = i->first; - - // Get object - ServerActiveObject *object = i->second; - if (object == NULL) - continue; - - // Discard if removed or deactivating - if(object->m_removed || object->m_pending_deactivation) - continue; - - f32 distance_f = object->getBasePosition(). - getDistanceFrom(playersao->getBasePosition()); - if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - // Discard if too far - if (distance_f > player_radius_f && player_radius_f != 0) - continue; - } else if (distance_f > radius_f) - continue; - - // Discard if already on current_objects - std::set::iterator n; - n = current_objects.find(id); - if(n != current_objects.end()) - continue; - // Add to added_objects - added_objects.push(id); - } -} - -/* - Finds out what objects have been removed from - inside a radius around a position -*/ -void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set ¤t_objects, - std::queue &removed_objects) -{ - f32 radius_f = radius * BS; - f32 player_radius_f = player_radius * BS; - - if (player_radius_f < 0) - player_radius_f = 0; - /* - Go through current_objects; object is removed if: - - object is not found in m_active_objects (this is actually an - error condition; objects should be set m_removed=true and removed - only after all clients have been informed about removal), or - - object has m_removed=true, or - - object is too far away - */ - for(std::set::iterator - i = current_objects.begin(); - i != current_objects.end(); ++i) - { - u16 id = *i; - ServerActiveObject *object = getActiveObject(id); - - if (object == NULL) { - infostream << "ServerEnvironment::getRemovedActiveObjects():" - << " object in current_objects is NULL" << std::endl; - removed_objects.push(id); - continue; - } - - if (object->m_removed || object->m_pending_deactivation) { - removed_objects.push(id); - continue; - } - - f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition()); - if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - if (distance_f <= player_radius_f || player_radius_f == 0) - continue; - } else if (distance_f <= radius_f) - continue; - - // Object is no longer visible - removed_objects.push(id); - } -} - -void ServerEnvironment::setStaticForActiveObjectsInBlock( - v3s16 blockpos, bool static_exists, v3s16 static_block) -{ - MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); - if (!block) - return; - - for (std::map::iterator - so_it = block->m_static_objects.m_active.begin(); - so_it != block->m_static_objects.m_active.end(); ++so_it) { - // Get the ServerActiveObject counterpart to this StaticObject - ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first); - if (ao_it == m_active_objects.end()) { - // If this ever happens, there must be some kind of nasty bug. - errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): " - "Object from MapBlock::m_static_objects::m_active not found " - "in m_active_objects"; - continue; - } - - ServerActiveObject *sao = ao_it->second; - sao->m_static_exists = static_exists; - sao->m_static_block = static_block; - } -} - -ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() -{ - if(m_active_object_messages.empty()) - return ActiveObjectMessage(0); - - ActiveObjectMessage message = m_active_object_messages.front(); - m_active_object_messages.pop(); - return message; -} - -/* - ************ Private methods ************* -*/ - -u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, - bool set_changed, u32 dtime_s) -{ - assert(object); // Pre-condition - if(object->getId() == 0){ - u16 new_id = getFreeServerActiveObjectId(m_active_objects); - if(new_id == 0) - { - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"no free ids available"<environmentDeletes()) - delete object; - return 0; - } - object->setId(new_id); - } - else{ - verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"supplied with id "<getId()<getId(), m_active_objects)) { - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"id is not free ("<getId()<<")"<environmentDeletes()) - delete object; - return 0; - } - - if (objectpos_over_limit(object->getBasePosition())) { - v3f p = object->getBasePosition(); - errorstream << "ServerEnvironment::addActiveObjectRaw(): " - << "object position (" << p.X << "," << p.Y << "," << p.Z - << ") outside maximum range" << std::endl; - if (object->environmentDeletes()) - delete object; - return 0; - } - - /*infostream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"added (id="<getId()<<")"<getId()] = object; - - verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"Added id="<getId()<<"; there are now " - <addObjectReference(object); - // Post-initialize object - object->addedToEnvironment(dtime_s); - - // Add static data to block - if(object->isStaticAllowed()) - { - // Add static object to active static list of the block - v3f objectpos = object->getBasePosition(); - std::string staticdata = object->getStaticData(); - StaticObject s_obj(object->getType(), objectpos, staticdata); - // Add to the block where the object is located in - v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); - MapBlock *block = m_map->emergeBlock(blockpos); - if(block){ - block->m_static_objects.m_active[object->getId()] = s_obj; - object->m_static_exists = true; - object->m_static_block = blockpos; - - if(set_changed) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_ADD_ACTIVE_OBJECT_RAW); - } else { - v3s16 p = floatToInt(objectpos, BS); - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"could not emerge block for storing id="<getId() - <<" statically (pos="<getId(); -} - -/* - Remove objects that satisfy (m_removed && m_known_by_count==0) -*/ -void ServerEnvironment::removeRemovedObjects() -{ - std::vector objects_to_remove; - for(ActiveObjectMap::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) { - u16 id = i->first; - ServerActiveObject* obj = i->second; - // This shouldn't happen but check it - if(obj == NULL) - { - infostream<<"NULL object found in ServerEnvironment" - <<" while finding removed objects. id="<m_removed && !obj->m_pending_deactivation) - continue; - - /* - Delete static data from block if is marked as removed - */ - if(obj->m_static_exists && obj->m_removed) - { - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if (block) { - block->m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REMOVE_OBJECTS_REMOVE); - obj->m_static_exists = false; - } else { - infostream<<"Failed to emerge block from which an object to " - <<"be removed was loaded from. id="< 0, don't actually remove. On some future - // invocation this will be 0, which is when removal will continue. - if(obj->m_known_by_count > 0) - continue; - - /* - Move static data from active to stored if not marked as removed - */ - if(obj->m_static_exists && !obj->m_removed){ - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if (block) { - std::map::iterator i = - block->m_static_objects.m_active.find(id); - if(i != block->m_static_objects.m_active.end()){ - block->m_static_objects.m_stored.push_back(i->second); - block->m_static_objects.m_active.erase(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REMOVE_OBJECTS_DEACTIVATE); - } - } else { - infostream<<"Failed to emerge block from which an object to " - <<"be deactivated was loaded from. id="<removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete - if(obj->environmentDeletes()) - delete obj; - - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - // Remove references from m_active_objects - for(std::vector::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } -} - -static void print_hexdump(std::ostream &o, const std::string &data) -{ - const int linelength = 16; - for(int l=0; ; l++){ - int i0 = linelength * l; - bool at_end = false; - int thislinelength = linelength; - if(i0 + thislinelength > (int)data.size()){ - thislinelength = data.size() - i0; - at_end = true; - } - for(int di=0; di= 32) - o<m_static_objects.m_stored.empty()) - return; - - verbosestream<<"ServerEnvironment::activateObjects(): " - <<"activating objects of block "<getPos()) - <<" ("<m_static_objects.m_stored.size() - <<" objects)"<m_static_objects.m_stored.size() > g_settings->getU16("max_objects_per_block")); - if (large_amount) { - errorstream<<"suspiciously large amount of objects detected: " - <m_static_objects.m_stored.size()<<" in " - <getPos()) - <<"; removing all of them."<m_static_objects.m_stored.clear(); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_TOO_MANY_OBJECTS); - return; - } - - // Activate stored objects - std::vector new_stored; - for (std::vector::iterator - i = block->m_static_objects.m_stored.begin(); - i != block->m_static_objects.m_stored.end(); ++i) { - StaticObject &s_obj = *i; - - // Create an active object from the data - ServerActiveObject *obj = ServerActiveObject::create - ((ActiveObjectType) s_obj.type, this, 0, s_obj.pos, s_obj.data); - // If couldn't create object, store static data back. - if(obj == NULL) { - errorstream<<"ServerEnvironment::activateObjects(): " - <<"failed to create active object from static object " - <<"in block "<getStaticData(); - StaticObject s_obj(obj->getType(), objectpos, staticdata_new); - block->m_static_objects.insert(id, s_obj); - obj->m_static_block = blockpos_o; - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_ADDED); - - // Delete from block where object was located - block = m_map->emergeBlock(old_static_block, false); - if(!block){ - errorstream<<"ServerEnvironment::deactivateFarObjects(): " - <<"Could not delete object id="<m_static_objects.remove(id); - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_REMOVED); - continue; - } - - // If block is active, don't remove - if(!force_delete && m_active_blocks.contains(blockpos_o)) - continue; - - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " - <<"deactivating object id="<m_known_by_count > 0 && !force_delete); - - /* - Update the static data - */ - - if(obj->isStaticAllowed()) - { - // Create new static object - std::string staticdata_new = obj->getStaticData(); - StaticObject s_obj(obj->getType(), objectpos, staticdata_new); - - bool stays_in_same_block = false; - bool data_changed = true; - - if (obj->m_static_exists) { - if (obj->m_static_block == blockpos_o) - stays_in_same_block = true; - - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - - if (block) { - std::map::iterator n = - block->m_static_objects.m_active.find(id); - if (n != block->m_static_objects.m_active.end()) { - StaticObject static_old = n->second; - - float save_movem = obj->getMinimumSavedMovement(); - - if (static_old.data == staticdata_new && - (static_old.pos - objectpos).getLength() < save_movem) - data_changed = false; - } else { - errorstream<<"ServerEnvironment::deactivateFarObjects(): " - <<"id="<m_static_block)<m_static_exists) - { - MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); - if(block) - { - block->m_static_objects.remove(id); - obj->m_static_exists = false; - // Only mark block as modified if data changed considerably - if(shall_be_written) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_CHANGED); - } - } - - // Add to the block where the object is located in - v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); - // Get or generate the block - MapBlock *block = NULL; - try{ - block = m_map->emergeBlock(blockpos); - } catch(InvalidPositionException &e){ - // Handled via NULL pointer - // NOTE: emergeBlock's failure is usually determined by it - // actually returning NULL - } - - if(block) - { - if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { - warningstream << "ServerEnv: Trying to store id = " << obj->getId() - << " statically but block " << PP(blockpos) - << " already contains " - << block->m_static_objects.m_stored.size() - << " objects." - << " Forcing delete." << std::endl; - force_delete = true; - } else { - // If static counterpart already exists in target block, - // remove it first. - // This shouldn't happen because the object is removed from - // the previous block before this according to - // obj->m_static_block, but happens rarely for some unknown - // reason. Unsuccessful attempts have been made to find - // said reason. - if(id && block->m_static_objects.m_active.find(id) != block->m_static_objects.m_active.end()){ - warningstream<<"ServerEnv: Performing hack #83274" - <m_static_objects.remove(id); - } - // Store static data - u16 store_id = pending_delete ? id : 0; - block->m_static_objects.insert(store_id, s_obj); - - // Only mark block as modified if data changed considerably - if(shall_be_written) - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_STATIC_DATA_CHANGED); - - obj->m_static_exists = true; - obj->m_static_block = block->getPos(); - } - } - else{ - if(!force_delete){ - v3s16 p = floatToInt(objectpos, BS); - errorstream<<"ServerEnv: Could not find or generate " - <<"a block for storing id="<getId() - <<" statically (pos="<m_pending_deactivation = true; - continue; - } - - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " - <<"object id="<removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); - - // Delete active object - if(obj->environmentDeletes()) - delete obj; - // Id to be removed from m_active_objects - objects_to_remove.push_back(id); - } - - // Remove references from m_active_objects - for(std::vector::iterator i = objects_to_remove.begin(); - i != objects_to_remove.end(); ++i) { - m_active_objects.erase(*i); - } -} - diff --git a/src/environment.h b/src/environment.h index 209d795d8..14a18421b 100644 --- a/src/environment.h +++ b/src/environment.h @@ -30,7 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc., - etc. */ -#include #include #include #include @@ -43,17 +42,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "threading/atomic.h" #include "network/networkprotocol.h" // for AccessDeniedCode -class ServerEnvironment; -class ActiveBlockModifier; -class ServerActiveObject; class ITextureSource; class IGameDef; class Map; -class ServerMap; class GameScripting; class Player; -class RemotePlayer; -class PlayerSAO; class PointedThing; class Environment @@ -134,395 +127,5 @@ private: DISABLE_CLASS_COPY(Environment); }; -/* - {Active, Loading} block modifier interface. - - These are fed into ServerEnvironment at initialization time; - ServerEnvironment handles deleting them. -*/ - -class ActiveBlockModifier -{ -public: - ActiveBlockModifier(){}; - virtual ~ActiveBlockModifier(){}; - - // Set of contents to trigger on - virtual std::set getTriggerContents()=0; - // Set of required neighbors (trigger doesn't happen if none are found) - // Empty = do not check neighbors - virtual std::set getRequiredNeighbors() - { return std::set(); } - // Trigger interval in seconds - virtual float getTriggerInterval() = 0; - // Random chance of (1 / return value), 0 is disallowed - virtual u32 getTriggerChance() = 0; - // Whether to modify chance to simulate time lost by an unnattended block - virtual bool getSimpleCatchUp() = 0; - // This is called usually at interval for 1/chance of the nodes - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, - u32 active_object_count, u32 active_object_count_wider){}; -}; - -struct ABMWithState -{ - ActiveBlockModifier *abm; - float timer; - - ABMWithState(ActiveBlockModifier *abm_); -}; - -struct LoadingBlockModifierDef -{ - // Set of contents to trigger on - std::set trigger_contents; - std::string name; - bool run_at_every_load; - - virtual ~LoadingBlockModifierDef() {} - virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; -}; - -struct LBMContentMapping -{ - typedef std::map > container_map; - container_map map; - - std::vector lbm_list; - - // Needs to be separate method (not inside destructor), - // because the LBMContentMapping may be copied and destructed - // many times during operation in the lbm_lookup_map. - void deleteContents(); - void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef); - const std::vector *lookup(content_t c) const; -}; - -class LBMManager -{ -public: - LBMManager(): - m_query_mode(false) - {} - - ~LBMManager(); - - // Don't call this after loadIntroductionTimes() ran. - void addLBMDef(LoadingBlockModifierDef *lbm_def); - - void loadIntroductionTimes(const std::string ×, - IGameDef *gamedef, u32 now); - - // Don't call this before loadIntroductionTimes() ran. - std::string createIntroductionTimesString(); - - // Don't call this before loadIntroductionTimes() ran. - void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp); - - // Warning: do not make this std::unordered_map, order is relevant here - typedef std::map lbm_lookup_map; - -private: - // Once we set this to true, we can only query, - // not modify - bool m_query_mode; - - // For m_query_mode == false: - // The key of the map is the LBM def's name. - // TODO make this std::unordered_map - std::map m_lbm_defs; - - // For m_query_mode == true: - // The key of the map is the LBM def's first introduction time. - lbm_lookup_map m_lbm_lookup; - - // Returns an iterator to the LBMs that were introduced - // after the given time. This is guaranteed to return - // valid values for everything - lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time) - { return m_lbm_lookup.lower_bound(time); } -}; - -/* - List of active blocks, used by ServerEnvironment -*/ - -class ActiveBlockList -{ -public: - void update(std::vector &active_positions, - s16 radius, - std::set &blocks_removed, - std::set &blocks_added); - - bool contains(v3s16 p){ - return (m_list.find(p) != m_list.end()); - } - - void clear(){ - m_list.clear(); - } - - std::set m_list; - std::set m_forceloaded_list; - -private: -}; - -/* - Operation mode for ServerEnvironment::clearObjects() -*/ -enum ClearObjectsMode { - // Load and go through every mapblock, clearing objects - CLEAR_OBJECTS_MODE_FULL, - - // Clear objects immediately in loaded mapblocks; - // clear objects in unloaded mapblocks only when the mapblocks are next activated. - CLEAR_OBJECTS_MODE_QUICK, -}; - -/* - The server-side environment. - - This is not thread-safe. Server uses an environment mutex. -*/ - -typedef UNORDERED_MAP ActiveObjectMap; - -class ServerEnvironment : public Environment -{ -public: - ServerEnvironment(ServerMap *map, GameScripting *scriptIface, - IGameDef *gamedef, const std::string &path_world); - ~ServerEnvironment(); - - Map & getMap(); - - ServerMap & getServerMap(); - - //TODO find way to remove this fct! - GameScripting* getScriptIface() - { return m_script; } - - IGameDef *getGameDef() - { return m_gamedef; } - - float getSendRecommendedInterval() - { return m_recommended_send_interval; } - - void kickAllPlayers(AccessDeniedCode reason, - const std::string &str_reason, bool reconnect); - // Save players - void saveLoadedPlayers(); - void savePlayer(RemotePlayer *player); - RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao); - void addPlayer(RemotePlayer *player); - void removePlayer(RemotePlayer *player); - - /* - Save and load time of day and game timer - */ - void saveMeta(); - void loadMeta(); - // to be called instead of loadMeta if - // env_meta.txt doesn't exist (e.g. new world) - void loadDefaultMeta(); - - u32 addParticleSpawner(float exptime); - u32 addParticleSpawner(float exptime, u16 attached_id); - void deleteParticleSpawner(u32 id, bool remove_from_object = true); - - /* - External ActiveObject interface - ------------------------------------------- - */ - - ServerActiveObject* getActiveObject(u16 id); - - /* - Add an active object to the environment. - Environment handles deletion of object. - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObject(ServerActiveObject *object); - - /* - Add an active object as a static object to the corresponding - MapBlock. - Caller allocates memory, ServerEnvironment frees memory. - Return value: true if succeeded, false if failed. - (note: not used, pending removal from engine) - */ - //bool addActiveObjectAsStatic(ServerActiveObject *object); - - /* - Find out what new objects have been added to - inside a radius around a position - */ - void getAddedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set ¤t_objects, - std::queue &added_objects); - - /* - Find out what new objects have been removed from - inside a radius around a position - */ - void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, - s16 player_radius, - std::set ¤t_objects, - std::queue &removed_objects); - - /* - Get the next message emitted by some active object. - Returns a message with id=0 if no messages are available. - */ - ActiveObjectMessage getActiveObjectMessage(); - - /* - Activate objects and dynamically modify for the dtime determined - from timestamp and additional_dtime - */ - void activateBlock(MapBlock *block, u32 additional_dtime=0); - - /* - {Active,Loading}BlockModifiers - ------------------------------------------- - */ - - void addActiveBlockModifier(ActiveBlockModifier *abm); - void addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm); - - /* - Other stuff - ------------------------------------------- - */ - - // Script-aware node setters - bool setNode(v3s16 p, const MapNode &n); - bool removeNode(v3s16 p); - bool swapNode(v3s16 p, const MapNode &n); - - // Find all active objects inside a radius around a point - void getObjectsInsideRadius(std::vector &objects, v3f pos, float radius); - - // Clear objects, loading and going through every MapBlock - void clearObjects(ClearObjectsMode mode); - - // This makes stuff happen - void step(f32 dtime); - - //check if there's a line of sight between two positions - bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL); - - u32 getGameTime() { return m_game_time; } - - void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } - float getMaxLagEstimate() { return m_max_lag_estimate; } - - std::set* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; - - // Sets the static object status all the active objects in the specified block - // This is only really needed for deleting blocks from the map - void setStaticForActiveObjectsInBlock(v3s16 blockpos, - bool static_exists, v3s16 static_block=v3s16(0,0,0)); - - RemotePlayer *getPlayer(const u16 peer_id); - RemotePlayer *getPlayer(const char* name); -private: - - /* - Internal ActiveObject interface - ------------------------------------------- - */ - - /* - Add an active object to the environment. - - Called by addActiveObject. - - Object may be deleted by environment immediately. - If id of object is 0, assigns a free id to it. - Returns the id of the object. - Returns 0 if not added and thus deleted. - */ - u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s); - - /* - Remove all objects that satisfy (m_removed && m_known_by_count==0) - */ - void removeRemovedObjects(); - - /* - Convert stored objects from block to active - */ - void activateObjects(MapBlock *block, u32 dtime_s); - - /* - Convert objects that are not in active blocks to static. - - If m_known_by_count != 0, active object is not deleted, but static - data is still updated. - - If force_delete is set, active object is deleted nevertheless. It - shall only be set so in the destructor of the environment. - */ - void deactivateFarObjects(bool force_delete); - - /* - Member variables - */ - - // The map - ServerMap *m_map; - // Lua state - GameScripting* m_script; - // Game definition - IGameDef *m_gamedef; - // World path - const std::string m_path_world; - // Active object list - ActiveObjectMap m_active_objects; - // Outgoing network message buffer for active objects - std::queue m_active_object_messages; - // Some timers - float m_send_recommended_timer; - IntervalLimiter m_object_management_interval; - // List of active blocks - ActiveBlockList m_active_blocks; - IntervalLimiter m_active_blocks_management_interval; - IntervalLimiter m_active_block_modifier_interval; - IntervalLimiter m_active_blocks_nodemetadata_interval; - int m_active_block_interval_overload_skip; - // Time from the beginning of the game in seconds. - // Incremented in step(). - u32 m_game_time; - // A helper variable for incrementing the latter - float m_game_time_fraction_counter; - // Time of last clearObjects call (game time). - // When a mapblock older than this is loaded, its objects are cleared. - u32 m_last_clear_objects_time; - // Active block modifiers - std::vector m_abms; - LBMManager m_lbm_mgr; - // An interval for generally sending object positions and stuff - float m_recommended_send_interval; - // Estimate for general maximum lag as determined by server. - // Can raise to high values like 15s with eg. map generation mods. - float m_max_lag_estimate; - - // peer_ids in here should be unique, except that there may be many 0s - std::vector m_players; - - // Particles - IntervalLimiter m_particle_management_interval; - UNORDERED_MAP m_particle_spawners; - UNORDERED_MAP m_particle_spawner_attachments; -}; - #endif diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index f36a2fa4e..469e7396b 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventorymanager.h" #include "log.h" -#include "environment.h" +#include "serverenvironment.h" #include "scripting_game.h" #include "serverobject.h" #include "settings.h" diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 073670c6d..84aa9252c 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., /******************************************************************************/ #include "pathfinder.h" -#include "environment.h" +#include "serverenvironment.h" #include "gamedef.h" #include "nodedef.h" #include "map.h" diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 89dd7978f..21b235f84 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define L_ENV_H_ #include "lua_api/l_base.h" -#include "environment.h" +#include "serverenvironment.h" class ModApiEnvMod : public ModApiBase { private: diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index c8bc7d558..3cdd3cbfe 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_inventory.h" #include "common/c_converter.h" #include "common/c_content.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" #include "gamedef.h" #include "nodemetadata.h" diff --git a/src/script/lua_api/l_nodetimer.cpp b/src/script/lua_api/l_nodetimer.cpp index 3242d6ea5..ed11cc58e 100644 --- a/src/script/lua_api/l_nodetimer.cpp +++ b/src/script/lua_api/l_nodetimer.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_nodetimer.h" #include "lua_api/l_internal.h" -#include "environment.h" +#include "serverenvironment.h" #include "map.h" diff --git a/src/server.h b/src/server.h index f0df0f9ec..fe7b50b77 100644 --- a/src/server.h +++ b/src/server.h @@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "util/thread.h" #include "util/basic_macros.h" -#include "environment.h" +#include "serverenvironment.h" #include "chat_interface.h" #include "clientiface.h" #include "remoteplayer.h" diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp new file mode 100644 index 000000000..6229e4cf1 --- /dev/null +++ b/src/serverenvironment.cpp @@ -0,0 +1,2167 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola + +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 "serverenvironment.h" +#include "content_sao.h" +#include "settings.h" +#include "log.h" +#include "nodedef.h" +#include "nodemetadata.h" +#include "gamedef.h" +#include "map.h" +#include "profiler.h" +#include "raycast.h" +#include "remoteplayer.h" +#include "scripting_game.h" +#include "server.h" +#include "voxelalgorithms.h" +#include "util/serialize.h" +#include "util/basic_macros.h" +#include "util/pointedthing.h" +#include "threading/mutex_auto_lock.h" +#include "filesys.h" + +#define LBM_NAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_:" + +// A number that is much smaller than the timeout for particle spawners should/could ever be +#define PARTICLE_SPAWNER_NO_EXPIRY -1024.f + +/* + ABMWithState +*/ + +ABMWithState::ABMWithState(ActiveBlockModifier *abm_): + abm(abm_), + timer(0) +{ + // Initialize timer to random value to spread processing + float itv = abm->getTriggerInterval(); + itv = MYMAX(0.001, itv); // No less than 1ms + int minval = MYMAX(-0.51*itv, -60); // Clamp to + int maxval = MYMIN(0.51*itv, 60); // +-60 seconds + timer = myrand_range(minval, maxval); +} + +/* + LBMManager +*/ + +void LBMContentMapping::deleteContents() +{ + for (std::vector::iterator it = lbm_list.begin(); + it != lbm_list.end(); ++it) { + delete *it; + } +} + +void LBMContentMapping::addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef) +{ + // Add the lbm_def to the LBMContentMapping. + // Unknown names get added to the global NameIdMapping. + INodeDefManager *nodedef = gamedef->ndef(); + + lbm_list.push_back(lbm_def); + + for (std::set::const_iterator it = lbm_def->trigger_contents.begin(); + it != lbm_def->trigger_contents.end(); ++it) { + std::set c_ids; + bool found = nodedef->getIds(*it, c_ids); + if (!found) { + content_t c_id = gamedef->allocateUnknownNodeId(*it); + if (c_id == CONTENT_IGNORE) { + // Seems it can't be allocated. + warningstream << "Could not internalize node name \"" << *it + << "\" while loading LBM \"" << lbm_def->name << "\"." << std::endl; + continue; + } + c_ids.insert(c_id); + } + + for (std::set::const_iterator iit = + c_ids.begin(); iit != c_ids.end(); ++iit) { + content_t c_id = *iit; + map[c_id].push_back(lbm_def); + } + } +} + +const std::vector * +LBMContentMapping::lookup(content_t c) const +{ + container_map::const_iterator it = map.find(c); + if (it == map.end()) + return NULL; + // This first dereferences the iterator, returning + // a std::vector + // reference, then we convert it to a pointer. + return &(it->second); +} + +LBMManager::~LBMManager() +{ + for (std::map::iterator it = + m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { + delete it->second; + } + for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); + it != m_lbm_lookup.end(); ++it) { + (it->second).deleteContents(); + } +} + +void LBMManager::addLBMDef(LoadingBlockModifierDef *lbm_def) +{ + // Precondition, in query mode the map isn't used anymore + FATAL_ERROR_IF(m_query_mode == true, + "attempted to modify LBMManager in query mode"); + + if (!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) { + throw ModError("Error adding LBM \"" + lbm_def->name + + "\": Does not follow naming conventions: " + "Only chararacters [a-z0-9_:] are allowed."); + } + + m_lbm_defs[lbm_def->name] = lbm_def; +} + +void LBMManager::loadIntroductionTimes(const std::string ×, + IGameDef *gamedef, u32 now) +{ + m_query_mode = true; + + // name -> time map. + // Storing it in a map first instead of + // handling the stuff directly in the loop + // removes all duplicate entries. + // TODO make this std::unordered_map + std::map introduction_times; + + /* + The introduction times string consists of name~time entries, + with each entry terminated by a semicolon. The time is decimal. + */ + + size_t idx = 0; + size_t idx_new; + while ((idx_new = times.find(";", idx)) != std::string::npos) { + std::string entry = times.substr(idx, idx_new - idx); + std::vector components = str_split(entry, '~'); + if (components.size() != 2) + throw SerializationError("Introduction times entry \"" + + entry + "\" requires exactly one '~'!"); + const std::string &name = components[0]; + u32 time = from_string(components[1]); + introduction_times[name] = time; + idx = idx_new + 1; + } + + // Put stuff from introduction_times into m_lbm_lookup + for (std::map::const_iterator it = introduction_times.begin(); + it != introduction_times.end(); ++it) { + const std::string &name = it->first; + u32 time = it->second; + + std::map::iterator def_it = + m_lbm_defs.find(name); + if (def_it == m_lbm_defs.end()) { + // This seems to be an LBM entry for + // an LBM we haven't loaded. Discard it. + continue; + } + LoadingBlockModifierDef *lbm_def = def_it->second; + if (lbm_def->run_at_every_load) { + // This seems to be an LBM entry for + // an LBM that runs at every load. + // Don't add it just yet. + continue; + } + + m_lbm_lookup[time].addLBM(lbm_def, gamedef); + + // Erase the entry so that we know later + // what elements didn't get put into m_lbm_lookup + m_lbm_defs.erase(name); + } + + // Now also add the elements from m_lbm_defs to m_lbm_lookup + // that weren't added in the previous step. + // They are introduced first time to this world, + // or are run at every load (introducement time hardcoded to U32_MAX). + + LBMContentMapping &lbms_we_introduce_now = m_lbm_lookup[now]; + LBMContentMapping &lbms_running_always = m_lbm_lookup[U32_MAX]; + + for (std::map::iterator it = + m_lbm_defs.begin(); it != m_lbm_defs.end(); ++it) { + if (it->second->run_at_every_load) { + lbms_running_always.addLBM(it->second, gamedef); + } else { + lbms_we_introduce_now.addLBM(it->second, gamedef); + } + } + + // Clear the list, so that we don't delete remaining elements + // twice in the destructor + m_lbm_defs.clear(); +} + +std::string LBMManager::createIntroductionTimesString() +{ + // Precondition, we must be in query mode + FATAL_ERROR_IF(m_query_mode == false, + "attempted to query on non fully set up LBMManager"); + + std::ostringstream oss; + for (lbm_lookup_map::iterator it = m_lbm_lookup.begin(); + it != m_lbm_lookup.end(); ++it) { + u32 time = it->first; + std::vector &lbm_list = it->second.lbm_list; + for (std::vector::iterator iit = lbm_list.begin(); + iit != lbm_list.end(); ++iit) { + // Don't add if the LBM runs at every load, + // then introducement time is hardcoded + // and doesn't need to be stored + if ((*iit)->run_at_every_load) + continue; + oss << (*iit)->name << "~" << time << ";"; + } + } + return oss.str(); +} + +void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp) +{ + // Precondition, we need m_lbm_lookup to be initialized + FATAL_ERROR_IF(m_query_mode == false, + "attempted to query on non fully set up LBMManager"); + v3s16 pos_of_block = block->getPosRelative(); + v3s16 pos; + MapNode n; + content_t c; + lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp); + for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++) + for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++) + for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) + { + n = block->getNodeNoEx(pos); + c = n.getContent(); + for (LBMManager::lbm_lookup_map::const_iterator iit = it; + iit != m_lbm_lookup.end(); ++iit) { + const std::vector *lbm_list = + iit->second.lookup(c); + if (!lbm_list) + continue; + for (std::vector::const_iterator iit = + lbm_list->begin(); iit != lbm_list->end(); ++iit) { + (*iit)->trigger(env, pos + pos_of_block, n); + } + } + } +} + +/* + ActiveBlockList +*/ + +void fillRadiusBlock(v3s16 p0, s16 r, std::set &list) +{ + v3s16 p; + for(p.X=p0.X-r; p.X<=p0.X+r; p.X++) + for(p.Y=p0.Y-r; p.Y<=p0.Y+r; p.Y++) + for(p.Z=p0.Z-r; p.Z<=p0.Z+r; p.Z++) + { + // limit to a sphere + if (p.getDistanceFrom(p0) <= r) { + // Set in list + list.insert(p); + } + } +} + +void ActiveBlockList::update(std::vector &active_positions, + s16 radius, + std::set &blocks_removed, + std::set &blocks_added) +{ + /* + Create the new list + */ + std::set newlist = m_forceloaded_list; + for(std::vector::iterator i = active_positions.begin(); + i != active_positions.end(); ++i) + { + fillRadiusBlock(*i, radius, newlist); + } + + /* + Find out which blocks on the old list are not on the new list + */ + // Go through old list + for(std::set::iterator i = m_list.begin(); + i != m_list.end(); ++i) + { + v3s16 p = *i; + // If not on new list, it's been removed + if(newlist.find(p) == newlist.end()) + blocks_removed.insert(p); + } + + /* + Find out which blocks on the new list are not on the old list + */ + // Go through new list + for(std::set::iterator i = newlist.begin(); + i != newlist.end(); ++i) + { + v3s16 p = *i; + // If not on old list, it's been added + if(m_list.find(p) == m_list.end()) + blocks_added.insert(p); + } + + /* + Update m_list + */ + m_list.clear(); + for(std::set::iterator i = newlist.begin(); + i != newlist.end(); ++i) + { + v3s16 p = *i; + m_list.insert(p); + } +} + +/* + ServerEnvironment +*/ + +ServerEnvironment::ServerEnvironment(ServerMap *map, + GameScripting *scriptIface, IGameDef *gamedef, + const std::string &path_world) : + m_map(map), + m_script(scriptIface), + m_gamedef(gamedef), + m_path_world(path_world), + m_send_recommended_timer(0), + m_active_block_interval_overload_skip(0), + m_game_time(0), + m_game_time_fraction_counter(0), + m_last_clear_objects_time(0), + m_recommended_send_interval(0.1), + m_max_lag_estimate(0.1) +{ +} + +ServerEnvironment::~ServerEnvironment() +{ + // Clear active block list. + // This makes the next one delete all active objects. + m_active_blocks.clear(); + + // Convert all objects to static and delete the active objects + deactivateFarObjects(true); + + // Drop/delete map + m_map->drop(); + + // Delete ActiveBlockModifiers + for (std::vector::iterator + i = m_abms.begin(); i != m_abms.end(); ++i){ + delete i->abm; + } + + // Deallocate players + for (std::vector::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + delete (*i); + } +} + +Map & ServerEnvironment::getMap() +{ + return *m_map; +} + +ServerMap & ServerEnvironment::getServerMap() +{ + return *m_map; +} + +RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id) +{ + for (std::vector::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = *i; + if (player->peer_id == peer_id) + return player; + } + return NULL; +} + +RemotePlayer *ServerEnvironment::getPlayer(const char* name) +{ + for (std::vector::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = *i; + if (strcmp(player->getName(), name) == 0) + return player; + } + return NULL; +} + +void ServerEnvironment::addPlayer(RemotePlayer *player) +{ + DSTACK(FUNCTION_NAME); + /* + Check that peer_ids are unique. + Also check that names are unique. + Exception: there can be multiple players with peer_id=0 + */ + // If peer id is non-zero, it has to be unique. + if (player->peer_id != 0) + FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique"); + // Name has to be unique. + FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique"); + // Add. + m_players.push_back(player); +} + +void ServerEnvironment::removePlayer(RemotePlayer *player) +{ + for (std::vector::iterator it = m_players.begin(); + it != m_players.end(); ++it) { + if ((*it) == player) { + delete *it; + m_players.erase(it); + return; + } + } +} + +bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p) +{ + float distance = pos1.getDistanceFrom(pos2); + + //calculate normalized direction vector + v3f normalized_vector = v3f((pos2.X - pos1.X)/distance, + (pos2.Y - pos1.Y)/distance, + (pos2.Z - pos1.Z)/distance); + + //find out if there's a node on path between pos1 and pos2 + for (float i = 1; i < distance; i += stepsize) { + v3s16 pos = floatToInt(v3f(normalized_vector.X * i, + normalized_vector.Y * i, + normalized_vector.Z * i) +pos1,BS); + + MapNode n = getMap().getNodeNoEx(pos); + + if(n.param0 != CONTENT_AIR) { + if (p) { + *p = pos; + } + return false; + } + } + return true; +} + +void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, + const std::string &str_reason, bool reconnect) +{ + for (std::vector::iterator it = m_players.begin(); + it != m_players.end(); ++it) { + RemotePlayer *player = dynamic_cast(*it); + ((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id, + player->protocol_version, reason, str_reason, reconnect); + } +} + +void ServerEnvironment::saveLoadedPlayers() +{ + std::string players_path = m_path_world + DIR_DELIM "players"; + fs::CreateDir(players_path); + + for (std::vector::iterator it = m_players.begin(); + it != m_players.end(); + ++it) { + if ((*it)->checkModified()) { + (*it)->save(players_path, m_gamedef); + } + } +} + +void ServerEnvironment::savePlayer(RemotePlayer *player) +{ + std::string players_path = m_path_world + DIR_DELIM "players"; + fs::CreateDir(players_path); + + player->save(players_path, m_gamedef); +} + +RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao) +{ + bool newplayer = false; + bool found = false; + std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM; + std::string path = players_path + playername; + + RemotePlayer *player = getPlayer(playername.c_str()); + if (!player) { + player = new RemotePlayer("", m_gamedef->idef()); + newplayer = true; + } + + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { + //// Open file and deserialize + std::ifstream is(path.c_str(), std::ios_base::binary); + if (!is.good()) + continue; + + player->deSerialize(is, path, sao); + is.close(); + + if (player->getName() == playername) { + found = true; + break; + } + + path = players_path + playername + itos(i); + } + + if (!found) { + infostream << "Player file for player " << playername + << " not found" << std::endl; + if (newplayer) + delete player; + + return NULL; + } + + if (newplayer) { + addPlayer(player); + } + player->setModified(false); + return player; +} + +void ServerEnvironment::saveMeta() +{ + std::string path = m_path_world + DIR_DELIM "env_meta.txt"; + + // Open file and serialize + std::ostringstream ss(std::ios_base::binary); + + Settings args; + args.setU64("game_time", m_game_time); + args.setU64("time_of_day", getTimeOfDay()); + args.setU64("last_clear_objects_time", m_last_clear_objects_time); + args.setU64("lbm_introduction_times_version", 1); + args.set("lbm_introduction_times", + m_lbm_mgr.createIntroductionTimesString()); + args.setU64("day_count", m_day_count); + args.writeLines(ss); + ss<<"EnvArgsEnd\n"; + + if(!fs::safeWriteToFile(path, ss.str())) + { + infostream<<"ServerEnvironment::saveMeta(): Failed to write " + < required_neighbors; +}; + +class ABMHandler +{ +private: + ServerEnvironment *m_env; + std::vector *> m_aabms; +public: + ABMHandler(std::vector &abms, + float dtime_s, ServerEnvironment *env, + bool use_timers): + m_env(env) + { + if(dtime_s < 0.001) + return; + INodeDefManager *ndef = env->getGameDef()->ndef(); + for(std::vector::iterator + i = abms.begin(); i != abms.end(); ++i) { + ActiveBlockModifier *abm = i->abm; + float trigger_interval = abm->getTriggerInterval(); + if(trigger_interval < 0.001) + trigger_interval = 0.001; + float actual_interval = dtime_s; + if(use_timers){ + i->timer += dtime_s; + if(i->timer < trigger_interval) + continue; + i->timer -= trigger_interval; + actual_interval = trigger_interval; + } + float chance = abm->getTriggerChance(); + if(chance == 0) + chance = 1; + ActiveABM aabm; + aabm.abm = abm; + if(abm->getSimpleCatchUp()) { + float intervals = actual_interval / trigger_interval; + if(intervals == 0) + continue; + aabm.chance = chance / intervals; + if(aabm.chance == 0) + aabm.chance = 1; + } else { + aabm.chance = chance; + } + // Trigger neighbors + std::set required_neighbors_s + = abm->getRequiredNeighbors(); + for(std::set::iterator + i = required_neighbors_s.begin(); + i != required_neighbors_s.end(); ++i) + { + ndef->getIds(*i, aabm.required_neighbors); + } + // Trigger contents + std::set contents_s = abm->getTriggerContents(); + for(std::set::iterator + i = contents_s.begin(); i != contents_s.end(); ++i) + { + std::set ids; + ndef->getIds(*i, ids); + for(std::set::const_iterator k = ids.begin(); + k != ids.end(); ++k) + { + content_t c = *k; + if (c >= m_aabms.size()) + m_aabms.resize(c + 256, NULL); + if (!m_aabms[c]) + m_aabms[c] = new std::vector; + m_aabms[c]->push_back(aabm); + } + } + } + } + + ~ABMHandler() + { + for (size_t i = 0; i < m_aabms.size(); i++) + delete m_aabms[i]; + } + + // Find out how many objects the given block and its neighbours contain. + // Returns the number of objects in the block, and also in 'wider' the + // number of objects in the block and all its neighbours. The latter + // may an estimate if any neighbours are unloaded. + u32 countObjects(MapBlock *block, ServerMap * map, u32 &wider) + { + wider = 0; + u32 wider_unknown_count = 0; + for(s16 x=-1; x<=1; x++) + for(s16 y=-1; y<=1; y++) + for(s16 z=-1; z<=1; z++) + { + MapBlock *block2 = map->getBlockNoCreateNoEx( + block->getPos() + v3s16(x,y,z)); + if(block2==NULL){ + wider_unknown_count++; + continue; + } + wider += block2->m_static_objects.m_active.size() + + block2->m_static_objects.m_stored.size(); + } + // Extrapolate + u32 active_object_count = block->m_static_objects.m_active.size(); + u32 wider_known_count = 3*3*3 - wider_unknown_count; + wider += wider_unknown_count * wider / wider_known_count; + return active_object_count; + + } + void apply(MapBlock *block) + { + if(m_aabms.empty() || block->isDummy()) + return; + + ServerMap *map = &m_env->getServerMap(); + + u32 active_object_count_wider; + u32 active_object_count = this->countObjects(block, map, active_object_count_wider); + m_env->m_added_objects = 0; + + v3s16 p0; + for(p0.X=0; p0.XgetNodeUnsafe(p0); + content_t c = n.getContent(); + + if (c >= m_aabms.size() || !m_aabms[c]) + continue; + + v3s16 p = p0 + block->getPosRelative(); + for(std::vector::iterator + i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { + if(myrand() % i->chance != 0) + continue; + + // Check neighbors + if(!i->required_neighbors.empty()) + { + v3s16 p1; + for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) + for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) + for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) + { + if(p1 == p0) + continue; + content_t c; + if (block->isValidPosition(p1)) { + // if the neighbor is found on the same map block + // get it straight from there + const MapNode &n = block->getNodeUnsafe(p1); + c = n.getContent(); + } else { + // otherwise consult the map + MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); + c = n.getContent(); + } + std::set::const_iterator k; + k = i->required_neighbors.find(c); + if(k != i->required_neighbors.end()){ + goto neighbor_found; + } + } + // No required neighbor found + continue; + } + neighbor_found: + + // Call all the trigger variations + i->abm->trigger(m_env, p, n); + i->abm->trigger(m_env, p, n, + active_object_count, active_object_count_wider); + + // Count surrounding objects again if the abms added any + if(m_env->m_added_objects > 0) { + active_object_count = countObjects(block, map, active_object_count_wider); + m_env->m_added_objects = 0; + } + } + } + } +}; + +void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) +{ + // Reset usage timer immediately, otherwise a block that becomes active + // again at around the same time as it would normally be unloaded will + // get unloaded incorrectly. (I think this still leaves a small possibility + // of a race condition between this and server::AsyncRunStep, which only + // some kind of synchronisation will fix, but it at least reduces the window + // of opportunity for it to break from seconds to nanoseconds) + block->resetUsageTimer(); + + // Get time difference + u32 dtime_s = 0; + u32 stamp = block->getTimestamp(); + if (m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) + dtime_s = m_game_time - stamp; + dtime_s += additional_dtime; + + /*infostream<<"ServerEnvironment::activateBlock(): block timestamp: " + <m_static_objects.m_stored.clear(); + // do not set changed flag to avoid unnecessary mapblock writes + } + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + + /*infostream<<"ServerEnvironment::activateBlock(): block is " + < elapsed_timers = + block->m_node_timers.step((float)dtime_s); + if (!elapsed_timers.empty()) { + MapNode n; + for (std::vector::iterator + i = elapsed_timers.begin(); + i != elapsed_timers.end(); ++i){ + n = block->getNodeNoEx(i->position); + v3s16 p = i->position + block->getPosRelative(); + if (m_script->node_on_timer(p, n, i->elapsed)) + block->setNodeTimer(NodeTimer(i->timeout, 0, i->position)); + } + } + + /* Handle ActiveBlockModifiers */ + ABMHandler abmhandler(m_abms, dtime_s, this, false); + abmhandler.apply(block); +} + +void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm) +{ + m_abms.push_back(ABMWithState(abm)); +} + +void ServerEnvironment::addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm) +{ + m_lbm_mgr.addLBMDef(lbm); +} + +bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) +{ + INodeDefManager *ndef = m_gamedef->ndef(); + MapNode n_old = m_map->getNodeNoEx(p); + + // Call destructor + if (ndef->get(n_old).has_on_destruct) + m_script->node_on_destruct(p, n_old); + + // Replace node + if (!m_map->addNodeWithEvent(p, n)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + // Call post-destructor + if (ndef->get(n_old).has_after_destruct) + m_script->node_after_destruct(p, n_old); + + // Call constructor + if (ndef->get(n).has_on_construct) + m_script->node_on_construct(p, n); + + return true; +} + +bool ServerEnvironment::removeNode(v3s16 p) +{ + INodeDefManager *ndef = m_gamedef->ndef(); + MapNode n_old = m_map->getNodeNoEx(p); + + // Call destructor + if (ndef->get(n_old).has_on_destruct) + m_script->node_on_destruct(p, n_old); + + // Replace with air + // This is slightly optimized compared to addNodeWithEvent(air) + if (!m_map->removeNodeWithEvent(p)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + // Call post-destructor + if (ndef->get(n_old).has_after_destruct) + m_script->node_after_destruct(p, n_old); + + // Air doesn't require constructor + return true; +} + +bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) +{ + if (!m_map->addNodeWithEvent(p, n, false)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + return true; +} + +void ServerEnvironment::getObjectsInsideRadius(std::vector &objects, v3f pos, float radius) +{ + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + u16 id = i->first; + v3f objectpos = obj->getBasePosition(); + if (objectpos.getDistanceFrom(pos) > radius) + continue; + objects.push_back(id); + } +} + +void ServerEnvironment::clearObjects(ClearObjectsMode mode) +{ + infostream << "ServerEnvironment::clearObjects(): " + << "Removing all active objects" << std::endl; + std::vector objects_to_remove; + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) + continue; + u16 id = i->first; + // Delete static object if block is loaded + if (obj->m_static_exists) { + MapBlock *block = m_map->getBlockNoCreateNoEx(obj->m_static_block); + if (block) { + block->m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_CLEAR_ALL_OBJECTS); + obj->m_static_exists = false; + } + } + // If known by some client, don't delete immediately + if (obj->m_known_by_count > 0) { + obj->m_pending_deactivation = true; + obj->m_removed = true; + continue; + } + + // Tell the object about removal + obj->removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete active object + if (obj->environmentDeletes()) + delete obj; + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + + // Remove references from m_active_objects + for (std::vector::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } + + // Get list of loaded blocks + std::vector loaded_blocks; + infostream << "ServerEnvironment::clearObjects(): " + << "Listing all loaded blocks" << std::endl; + m_map->listAllLoadedBlocks(loaded_blocks); + infostream << "ServerEnvironment::clearObjects(): " + << "Done listing all loaded blocks: " + << loaded_blocks.size()< loadable_blocks; + if (mode == CLEAR_OBJECTS_MODE_FULL) { + infostream << "ServerEnvironment::clearObjects(): " + << "Listing all loadable blocks" << std::endl; + m_map->listAllLoadableBlocks(loadable_blocks); + infostream << "ServerEnvironment::clearObjects(): " + << "Done listing all loadable blocks: " + << loadable_blocks.size() << std::endl; + } else { + loadable_blocks = loaded_blocks; + } + + infostream << "ServerEnvironment::clearObjects(): " + << "Now clearing objects in " << loadable_blocks.size() + << " blocks" << std::endl; + + // Grab a reference on each loaded block to avoid unloading it + for (std::vector::iterator i = loaded_blocks.begin(); + i != loaded_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + assert(block != NULL); + block->refGrab(); + } + + // Remove objects in all loadable blocks + u32 unload_interval = U32_MAX; + if (mode == CLEAR_OBJECTS_MODE_FULL) { + unload_interval = g_settings->getS32("max_clearobjects_extra_loaded_blocks"); + unload_interval = MYMAX(unload_interval, 1); + } + u32 report_interval = loadable_blocks.size() / 10; + u32 num_blocks_checked = 0; + u32 num_blocks_cleared = 0; + u32 num_objs_cleared = 0; + for (std::vector::iterator i = loadable_blocks.begin(); + i != loadable_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->emergeBlock(p, false); + if (!block) { + errorstream << "ServerEnvironment::clearObjects(): " + << "Failed to emerge block " << PP(p) << std::endl; + continue; + } + u32 num_stored = block->m_static_objects.m_stored.size(); + u32 num_active = block->m_static_objects.m_active.size(); + if (num_stored != 0 || num_active != 0) { + block->m_static_objects.m_stored.clear(); + block->m_static_objects.m_active.clear(); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_CLEAR_ALL_OBJECTS); + num_objs_cleared += num_stored + num_active; + num_blocks_cleared++; + } + num_blocks_checked++; + + if (report_interval != 0 && + num_blocks_checked % report_interval == 0) { + float percent = 100.0 * (float)num_blocks_checked / + loadable_blocks.size(); + infostream << "ServerEnvironment::clearObjects(): " + << "Cleared " << num_objs_cleared << " objects" + << " in " << num_blocks_cleared << " blocks (" + << percent << "%)" << std::endl; + } + if (num_blocks_checked % unload_interval == 0) { + m_map->unloadUnreferencedBlocks(); + } + } + m_map->unloadUnreferencedBlocks(); + + // Drop references that were added above + for (std::vector::iterator i = loaded_blocks.begin(); + i != loaded_blocks.end(); ++i) { + v3s16 p = *i; + MapBlock *block = m_map->getBlockNoCreateNoEx(p); + assert(block); + block->refDrop(); + } + + m_last_clear_objects_time = m_game_time; + + infostream << "ServerEnvironment::clearObjects(): " + << "Finished: Cleared " << num_objs_cleared << " objects" + << " in " << num_blocks_cleared << " blocks" << std::endl; +} + +void ServerEnvironment::step(float dtime) +{ + DSTACK(FUNCTION_NAME); + + //TimeTaker timer("ServerEnv step"); + + /* Step time of day */ + stepTimeOfDay(dtime); + + // Update this one + // NOTE: This is kind of funny on a singleplayer game, but doesn't + // really matter that much. + static const float server_step = g_settings->getFloat("dedicated_server_step"); + m_recommended_send_interval = server_step; + + /* + Increment game time + */ + { + m_game_time_fraction_counter += dtime; + u32 inc_i = (u32)m_game_time_fraction_counter; + m_game_time += inc_i; + m_game_time_fraction_counter -= (float)inc_i; + } + + /* + Handle players + */ + { + ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG); + for (std::vector::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = dynamic_cast(*i); + assert(player); + + // Ignore disconnected players + if(player->peer_id == 0) + continue; + + // Move + player->move(dtime, this, 100*BS); + } + } + + /* + Manage active block list + */ + if (m_active_blocks_management_interval.step(dtime, m_cache_active_block_mgmt_interval)) { + ScopeProfiler sp(g_profiler, "SEnv: manage act. block list avg per interval", SPT_AVG); + /* + Get player block positions + */ + std::vector players_blockpos; + for (std::vector::iterator i = m_players.begin(); + i != m_players.end(); ++i) { + RemotePlayer *player = dynamic_cast(*i); + assert(player); + + // Ignore disconnected players + if (player->peer_id == 0) + continue; + + PlayerSAO *playersao = player->getPlayerSAO(); + assert(playersao); + + v3s16 blockpos = getNodeBlockPos( + floatToInt(playersao->getBasePosition(), BS)); + players_blockpos.push_back(blockpos); + } + + /* + Update list of active blocks, collecting changes + */ + static const s16 active_block_range = g_settings->getS16("active_block_range"); + std::set blocks_removed; + std::set blocks_added; + m_active_blocks.update(players_blockpos, active_block_range, + blocks_removed, blocks_added); + + /* + Handle removed blocks + */ + + // Convert active objects that are no more in active blocks to static + deactivateFarObjects(false); + + for(std::set::iterator + i = blocks_removed.begin(); + i != blocks_removed.end(); ++i) { + v3s16 p = *i; + + /* infostream<<"Server: Block " << PP(p) + << " became inactive"<getBlockNoCreateNoEx(p); + if(block==NULL) + continue; + + // Set current time as timestamp (and let it set ChangedFlag) + block->setTimestamp(m_game_time); + } + + /* + Handle added blocks + */ + + for(std::set::iterator + i = blocks_added.begin(); + i != blocks_added.end(); ++i) + { + v3s16 p = *i; + + MapBlock *block = m_map->getBlockOrEmerge(p); + if(block==NULL){ + m_active_blocks.m_list.erase(p); + continue; + } + + activateBlock(block); + /* infostream<<"Server: Block " << PP(p) + << " became active"<::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) + { + v3s16 p = *i; + + /*infostream<<"Server: Block ("<getBlockNoCreateNoEx(p); + if(block==NULL) + continue; + + // Reset block usage timer + block->resetUsageTimer(); + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + // If time has changed much from the one on disk, + // set block to be saved when it is unloaded + if(block->getTimestamp() > block->getDiskTimestamp() + 60) + block->raiseModified(MOD_STATE_WRITE_AT_UNLOAD, + MOD_REASON_BLOCK_EXPIRED); + + // Run node timers + std::vector elapsed_timers = + block->m_node_timers.step((float)dtime); + if (!elapsed_timers.empty()) { + MapNode n; + for (std::vector::iterator i = elapsed_timers.begin(); + i != elapsed_timers.end(); ++i) { + n = block->getNodeNoEx(i->position); + p = i->position + block->getPosRelative(); + if (m_script->node_on_timer(p, n, i->elapsed)) { + block->setNodeTimer(NodeTimer( + i->timeout, 0, i->position)); + } + } + } + } + } + + if (m_active_block_modifier_interval.step(dtime, m_cache_abm_interval)) + do{ // breakable + if(m_active_block_interval_overload_skip > 0){ + ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips"); + m_active_block_interval_overload_skip--; + break; + } + ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg per interval", SPT_AVG); + TimeTaker timer("modify in active blocks per interval"); + + // Initialize handling of ActiveBlockModifiers + ABMHandler abmhandler(m_abms, m_cache_abm_interval, this, true); + + for(std::set::iterator + i = m_active_blocks.m_list.begin(); + i != m_active_blocks.m_list.end(); ++i) + { + v3s16 p = *i; + + /*infostream<<"Server: Block ("<getBlockNoCreateNoEx(p); + if(block == NULL) + continue; + + // Set current time as timestamp + block->setTimestampNoChangedFlag(m_game_time); + + /* Handle ActiveBlockModifiers */ + abmhandler.apply(block); + } + + u32 time_ms = timer.stop(true); + u32 max_time_ms = 200; + if(time_ms > max_time_ms){ + warningstream<<"active block modifiers took " + <environment_Step(dtime); + + /* + Step active objects + */ + { + ScopeProfiler sp(g_profiler, "SEnv: step act. objs avg", SPT_AVG); + //TimeTaker timer("Step active objects"); + + g_profiler->avg("SEnv: num of objects", m_active_objects.size()); + + // This helps the objects to send data at the same time + bool send_recommended = false; + m_send_recommended_timer += dtime; + if(m_send_recommended_timer > getSendRecommendedInterval()) + { + m_send_recommended_timer -= getSendRecommendedInterval(); + send_recommended = true; + } + + for(ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + ServerActiveObject* obj = i->second; + // Don't step if is to be removed or stored statically + if(obj->m_removed || obj->m_pending_deactivation) + continue; + // Step object + obj->step(dtime, send_recommended); + // Read messages from object + while(!obj->m_messages_out.empty()) + { + m_active_object_messages.push( + obj->m_messages_out.front()); + obj->m_messages_out.pop(); + } + } + } + + /* + Manage active objects + */ + if(m_object_management_interval.step(dtime, 0.5)) + { + ScopeProfiler sp(g_profiler, "SEnv: remove removed objs avg /.5s", SPT_AVG); + /* + Remove objects that satisfy (m_removed && m_known_by_count==0) + */ + removeRemovedObjects(); + } + + /* + Manage particle spawner expiration + */ + if (m_particle_management_interval.step(dtime, 1.0)) { + for (UNORDERED_MAP::iterator i = m_particle_spawners.begin(); + i != m_particle_spawners.end(); ) { + //non expiring spawners + if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) { + ++i; + continue; + } + + i->second -= 1.0f; + if (i->second <= 0.f) + m_particle_spawners.erase(i++); + else + ++i; + } + } +} + +u32 ServerEnvironment::addParticleSpawner(float exptime) +{ + // Timers with lifetime 0 do not expire + float time = exptime > 0.f ? exptime : PARTICLE_SPAWNER_NO_EXPIRY; + + u32 id = 0; + for (;;) { // look for unused particlespawner id + id++; + UNORDERED_MAP::iterator f = m_particle_spawners.find(id); + if (f == m_particle_spawners.end()) { + m_particle_spawners[id] = time; + break; + } + } + return id; +} + +u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id) +{ + u32 id = addParticleSpawner(exptime); + m_particle_spawner_attachments[id] = attached_id; + if (ServerActiveObject *obj = getActiveObject(attached_id)) { + obj->attachParticleSpawner(id); + } + return id; +} + +void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object) +{ + m_particle_spawners.erase(id); + UNORDERED_MAP::iterator it = m_particle_spawner_attachments.find(id); + if (it != m_particle_spawner_attachments.end()) { + u16 obj_id = (*it).second; + ServerActiveObject *sao = getActiveObject(obj_id); + if (sao != NULL && remove_from_object) { + sao->detachParticleSpawner(id); + } + m_particle_spawner_attachments.erase(id); + } +} + +ServerActiveObject* ServerEnvironment::getActiveObject(u16 id) +{ + ActiveObjectMap::iterator n = m_active_objects.find(id); + return (n != m_active_objects.end() ? n->second : NULL); +} + +bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects) +{ + if (id == 0) + return false; + + return objects.find(id) == objects.end(); +} + +u16 getFreeServerActiveObjectId(ActiveObjectMap &objects) +{ + //try to reuse id's as late as possible + static u16 last_used_id = 0; + u16 startid = last_used_id; + for(;;) + { + last_used_id ++; + if(isFreeServerActiveObjectId(last_used_id, objects)) + return last_used_id; + + if(last_used_id == startid) + return 0; + } +} + +u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) +{ + assert(object); // Pre-condition + m_added_objects++; + u16 id = addActiveObjectRaw(object, true, 0); + return id; +} + +/* + Finds out what new objects have been added to + inside a radius around a position +*/ +void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set ¤t_objects, + std::queue &added_objects) +{ + f32 radius_f = radius * BS; + f32 player_radius_f = player_radius * BS; + + if (player_radius_f < 0) + player_radius_f = 0; + /* + Go through the object list, + - discard m_removed objects, + - discard objects that are too far away, + - discard objects that are found in current_objects. + - add remaining objects to added_objects + */ + for (ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + u16 id = i->first; + + // Get object + ServerActiveObject *object = i->second; + if (object == NULL) + continue; + + // Discard if removed or deactivating + if(object->m_removed || object->m_pending_deactivation) + continue; + + f32 distance_f = object->getBasePosition(). + getDistanceFrom(playersao->getBasePosition()); + if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + // Discard if too far + if (distance_f > player_radius_f && player_radius_f != 0) + continue; + } else if (distance_f > radius_f) + continue; + + // Discard if already on current_objects + std::set::iterator n; + n = current_objects.find(id); + if(n != current_objects.end()) + continue; + // Add to added_objects + added_objects.push(id); + } +} + +/* + Finds out what objects have been removed from + inside a radius around a position +*/ +void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set ¤t_objects, + std::queue &removed_objects) +{ + f32 radius_f = radius * BS; + f32 player_radius_f = player_radius * BS; + + if (player_radius_f < 0) + player_radius_f = 0; + /* + Go through current_objects; object is removed if: + - object is not found in m_active_objects (this is actually an + error condition; objects should be set m_removed=true and removed + only after all clients have been informed about removal), or + - object has m_removed=true, or + - object is too far away + */ + for(std::set::iterator + i = current_objects.begin(); + i != current_objects.end(); ++i) + { + u16 id = *i; + ServerActiveObject *object = getActiveObject(id); + + if (object == NULL) { + infostream << "ServerEnvironment::getRemovedActiveObjects():" + << " object in current_objects is NULL" << std::endl; + removed_objects.push(id); + continue; + } + + if (object->m_removed || object->m_pending_deactivation) { + removed_objects.push(id); + continue; + } + + f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition()); + if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + if (distance_f <= player_radius_f || player_radius_f == 0) + continue; + } else if (distance_f <= radius_f) + continue; + + // Object is no longer visible + removed_objects.push(id); + } +} + +void ServerEnvironment::setStaticForActiveObjectsInBlock( + v3s16 blockpos, bool static_exists, v3s16 static_block) +{ + MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + if (!block) + return; + + for (std::map::iterator + so_it = block->m_static_objects.m_active.begin(); + so_it != block->m_static_objects.m_active.end(); ++so_it) { + // Get the ServerActiveObject counterpart to this StaticObject + ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first); + if (ao_it == m_active_objects.end()) { + // If this ever happens, there must be some kind of nasty bug. + errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): " + "Object from MapBlock::m_static_objects::m_active not found " + "in m_active_objects"; + continue; + } + + ServerActiveObject *sao = ao_it->second; + sao->m_static_exists = static_exists; + sao->m_static_block = static_block; + } +} + +ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() +{ + if(m_active_object_messages.empty()) + return ActiveObjectMessage(0); + + ActiveObjectMessage message = m_active_object_messages.front(); + m_active_object_messages.pop(); + return message; +} + +/* + ************ Private methods ************* +*/ + +u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, + bool set_changed, u32 dtime_s) +{ + assert(object); // Pre-condition + if(object->getId() == 0){ + u16 new_id = getFreeServerActiveObjectId(m_active_objects); + if(new_id == 0) + { + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"no free ids available"<environmentDeletes()) + delete object; + return 0; + } + object->setId(new_id); + } + else{ + verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"supplied with id "<getId()<getId(), m_active_objects)) { + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"id is not free ("<getId()<<")"<environmentDeletes()) + delete object; + return 0; + } + + if (objectpos_over_limit(object->getBasePosition())) { + v3f p = object->getBasePosition(); + errorstream << "ServerEnvironment::addActiveObjectRaw(): " + << "object position (" << p.X << "," << p.Y << "," << p.Z + << ") outside maximum range" << std::endl; + if (object->environmentDeletes()) + delete object; + return 0; + } + + /*infostream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"added (id="<getId()<<")"<getId()] = object; + + verbosestream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"Added id="<getId()<<"; there are now " + <addObjectReference(object); + // Post-initialize object + object->addedToEnvironment(dtime_s); + + // Add static data to block + if(object->isStaticAllowed()) + { + // Add static object to active static list of the block + v3f objectpos = object->getBasePosition(); + std::string staticdata = object->getStaticData(); + StaticObject s_obj(object->getType(), objectpos, staticdata); + // Add to the block where the object is located in + v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); + MapBlock *block = m_map->emergeBlock(blockpos); + if(block){ + block->m_static_objects.m_active[object->getId()] = s_obj; + object->m_static_exists = true; + object->m_static_block = blockpos; + + if(set_changed) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_ADD_ACTIVE_OBJECT_RAW); + } else { + v3s16 p = floatToInt(objectpos, BS); + errorstream<<"ServerEnvironment::addActiveObjectRaw(): " + <<"could not emerge block for storing id="<getId() + <<" statically (pos="<getId(); +} + +/* + Remove objects that satisfy (m_removed && m_known_by_count==0) +*/ +void ServerEnvironment::removeRemovedObjects() +{ + std::vector objects_to_remove; + for(ActiveObjectMap::iterator i = m_active_objects.begin(); + i != m_active_objects.end(); ++i) { + u16 id = i->first; + ServerActiveObject* obj = i->second; + // This shouldn't happen but check it + if(obj == NULL) + { + infostream<<"NULL object found in ServerEnvironment" + <<" while finding removed objects. id="<m_removed && !obj->m_pending_deactivation) + continue; + + /* + Delete static data from block if is marked as removed + */ + if(obj->m_static_exists && obj->m_removed) + { + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if (block) { + block->m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_REMOVE_OBJECTS_REMOVE); + obj->m_static_exists = false; + } else { + infostream<<"Failed to emerge block from which an object to " + <<"be removed was loaded from. id="< 0, don't actually remove. On some future + // invocation this will be 0, which is when removal will continue. + if(obj->m_known_by_count > 0) + continue; + + /* + Move static data from active to stored if not marked as removed + */ + if(obj->m_static_exists && !obj->m_removed){ + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if (block) { + std::map::iterator i = + block->m_static_objects.m_active.find(id); + if(i != block->m_static_objects.m_active.end()){ + block->m_static_objects.m_stored.push_back(i->second); + block->m_static_objects.m_active.erase(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_REMOVE_OBJECTS_DEACTIVATE); + } + } else { + infostream<<"Failed to emerge block from which an object to " + <<"be deactivated was loaded from. id="<removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete + if(obj->environmentDeletes()) + delete obj; + + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + // Remove references from m_active_objects + for(std::vector::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } +} + +static void print_hexdump(std::ostream &o, const std::string &data) +{ + const int linelength = 16; + for(int l=0; ; l++){ + int i0 = linelength * l; + bool at_end = false; + int thislinelength = linelength; + if(i0 + thislinelength > (int)data.size()){ + thislinelength = data.size() - i0; + at_end = true; + } + for(int di=0; di= 32) + o<m_static_objects.m_stored.empty()) + return; + + verbosestream<<"ServerEnvironment::activateObjects(): " + <<"activating objects of block "<getPos()) + <<" ("<m_static_objects.m_stored.size() + <<" objects)"<m_static_objects.m_stored.size() > g_settings->getU16("max_objects_per_block")); + if (large_amount) { + errorstream<<"suspiciously large amount of objects detected: " + <m_static_objects.m_stored.size()<<" in " + <getPos()) + <<"; removing all of them."<m_static_objects.m_stored.clear(); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_TOO_MANY_OBJECTS); + return; + } + + // Activate stored objects + std::vector new_stored; + for (std::vector::iterator + i = block->m_static_objects.m_stored.begin(); + i != block->m_static_objects.m_stored.end(); ++i) { + StaticObject &s_obj = *i; + + // Create an active object from the data + ServerActiveObject *obj = ServerActiveObject::create + ((ActiveObjectType) s_obj.type, this, 0, s_obj.pos, s_obj.data); + // If couldn't create object, store static data back. + if(obj == NULL) { + errorstream<<"ServerEnvironment::activateObjects(): " + <<"failed to create active object from static object " + <<"in block "<getStaticData(); + StaticObject s_obj(obj->getType(), objectpos, staticdata_new); + block->m_static_objects.insert(id, s_obj); + obj->m_static_block = blockpos_o; + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_ADDED); + + // Delete from block where object was located + block = m_map->emergeBlock(old_static_block, false); + if(!block){ + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"Could not delete object id="<m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_REMOVED); + continue; + } + + // If block is active, don't remove + if(!force_delete && m_active_blocks.contains(blockpos_o)) + continue; + + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " + <<"deactivating object id="<m_known_by_count > 0 && !force_delete); + + /* + Update the static data + */ + + if(obj->isStaticAllowed()) + { + // Create new static object + std::string staticdata_new = obj->getStaticData(); + StaticObject s_obj(obj->getType(), objectpos, staticdata_new); + + bool stays_in_same_block = false; + bool data_changed = true; + + if (obj->m_static_exists) { + if (obj->m_static_block == blockpos_o) + stays_in_same_block = true; + + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + + if (block) { + std::map::iterator n = + block->m_static_objects.m_active.find(id); + if (n != block->m_static_objects.m_active.end()) { + StaticObject static_old = n->second; + + float save_movem = obj->getMinimumSavedMovement(); + + if (static_old.data == staticdata_new && + (static_old.pos - objectpos).getLength() < save_movem) + data_changed = false; + } else { + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"id="<m_static_block)<m_static_exists) + { + MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); + if(block) + { + block->m_static_objects.remove(id); + obj->m_static_exists = false; + // Only mark block as modified if data changed considerably + if(shall_be_written) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_CHANGED); + } + } + + // Add to the block where the object is located in + v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); + // Get or generate the block + MapBlock *block = NULL; + try{ + block = m_map->emergeBlock(blockpos); + } catch(InvalidPositionException &e){ + // Handled via NULL pointer + // NOTE: emergeBlock's failure is usually determined by it + // actually returning NULL + } + + if(block) + { + if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { + warningstream << "ServerEnv: Trying to store id = " << obj->getId() + << " statically but block " << PP(blockpos) + << " already contains " + << block->m_static_objects.m_stored.size() + << " objects." + << " Forcing delete." << std::endl; + force_delete = true; + } else { + // If static counterpart already exists in target block, + // remove it first. + // This shouldn't happen because the object is removed from + // the previous block before this according to + // obj->m_static_block, but happens rarely for some unknown + // reason. Unsuccessful attempts have been made to find + // said reason. + if(id && block->m_static_objects.m_active.find(id) != block->m_static_objects.m_active.end()){ + warningstream<<"ServerEnv: Performing hack #83274" + <m_static_objects.remove(id); + } + // Store static data + u16 store_id = pending_delete ? id : 0; + block->m_static_objects.insert(store_id, s_obj); + + // Only mark block as modified if data changed considerably + if(shall_be_written) + block->raiseModified(MOD_STATE_WRITE_NEEDED, + MOD_REASON_STATIC_DATA_CHANGED); + + obj->m_static_exists = true; + obj->m_static_block = block->getPos(); + } + } + else{ + if(!force_delete){ + v3s16 p = floatToInt(objectpos, BS); + errorstream<<"ServerEnv: Could not find or generate " + <<"a block for storing id="<getId() + <<" statically (pos="<m_pending_deactivation = true; + continue; + } + + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " + <<"object id="<removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + + // Delete active object + if(obj->environmentDeletes()) + delete obj; + // Id to be removed from m_active_objects + objects_to_remove.push_back(id); + } + + // Remove references from m_active_objects + for(std::vector::iterator i = objects_to_remove.begin(); + i != objects_to_remove.end(); ++i) { + m_active_objects.erase(*i); + } +} diff --git a/src/serverenvironment.h b/src/serverenvironment.h new file mode 100644 index 000000000..20a783ea5 --- /dev/null +++ b/src/serverenvironment.h @@ -0,0 +1,423 @@ +/* +Minetest +Copyright (C) 2010-2017 celeron55, Perttu Ahola + +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 SERVER_ENVIRONMENT_HEADER +#define SERVER_ENVIRONMENT_HEADER + +#include "environment.h" + +class IGameDef; +class ServerMap; +class RemotePlayer; +class PlayerSAO; +class ServerEnvironment; +class ActiveBlockModifier; +class ServerActiveObject; + +/* + {Active, Loading} block modifier interface. + + These are fed into ServerEnvironment at initialization time; + ServerEnvironment handles deleting them. +*/ + +class ActiveBlockModifier +{ +public: + ActiveBlockModifier(){}; + virtual ~ActiveBlockModifier(){}; + + // Set of contents to trigger on + virtual std::set getTriggerContents()=0; + // Set of required neighbors (trigger doesn't happen if none are found) + // Empty = do not check neighbors + virtual std::set getRequiredNeighbors() + { return std::set(); } + // Trigger interval in seconds + virtual float getTriggerInterval() = 0; + // Random chance of (1 / return value), 0 is disallowed + virtual u32 getTriggerChance() = 0; + // Whether to modify chance to simulate time lost by an unnattended block + virtual bool getSimpleCatchUp() = 0; + // This is called usually at interval for 1/chance of the nodes + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, + u32 active_object_count, u32 active_object_count_wider){}; +}; + +struct ABMWithState +{ + ActiveBlockModifier *abm; + float timer; + + ABMWithState(ActiveBlockModifier *abm_); +}; + +struct LoadingBlockModifierDef +{ + // Set of contents to trigger on + std::set trigger_contents; + std::string name; + bool run_at_every_load; + + virtual ~LoadingBlockModifierDef() {} + virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; +}; + +struct LBMContentMapping +{ + typedef std::map > container_map; + container_map map; + + std::vector lbm_list; + + // Needs to be separate method (not inside destructor), + // because the LBMContentMapping may be copied and destructed + // many times during operation in the lbm_lookup_map. + void deleteContents(); + void addLBM(LoadingBlockModifierDef *lbm_def, IGameDef *gamedef); + const std::vector *lookup(content_t c) const; +}; + +class LBMManager +{ +public: + LBMManager(): + m_query_mode(false) + {} + + ~LBMManager(); + + // Don't call this after loadIntroductionTimes() ran. + void addLBMDef(LoadingBlockModifierDef *lbm_def); + + void loadIntroductionTimes(const std::string ×, + IGameDef *gamedef, u32 now); + + // Don't call this before loadIntroductionTimes() ran. + std::string createIntroductionTimesString(); + + // Don't call this before loadIntroductionTimes() ran. + void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp); + + // Warning: do not make this std::unordered_map, order is relevant here + typedef std::map lbm_lookup_map; + +private: + // Once we set this to true, we can only query, + // not modify + bool m_query_mode; + + // For m_query_mode == false: + // The key of the map is the LBM def's name. + // TODO make this std::unordered_map + std::map m_lbm_defs; + + // For m_query_mode == true: + // The key of the map is the LBM def's first introduction time. + lbm_lookup_map m_lbm_lookup; + + // Returns an iterator to the LBMs that were introduced + // after the given time. This is guaranteed to return + // valid values for everything + lbm_lookup_map::const_iterator getLBMsIntroducedAfter(u32 time) + { return m_lbm_lookup.lower_bound(time); } +}; + +/* + List of active blocks, used by ServerEnvironment +*/ + +class ActiveBlockList +{ +public: + void update(std::vector &active_positions, + s16 radius, + std::set &blocks_removed, + std::set &blocks_added); + + bool contains(v3s16 p){ + return (m_list.find(p) != m_list.end()); + } + + void clear(){ + m_list.clear(); + } + + std::set m_list; + std::set m_forceloaded_list; + +private: +}; + +/* + Operation mode for ServerEnvironment::clearObjects() +*/ +enum ClearObjectsMode { + // Load and go through every mapblock, clearing objects + CLEAR_OBJECTS_MODE_FULL, + + // Clear objects immediately in loaded mapblocks; + // clear objects in unloaded mapblocks only when the mapblocks are next activated. + CLEAR_OBJECTS_MODE_QUICK, +}; + +/* + The server-side environment. + + This is not thread-safe. Server uses an environment mutex. +*/ + +typedef UNORDERED_MAP ActiveObjectMap; + +class ServerEnvironment : public Environment +{ +public: + ServerEnvironment(ServerMap *map, GameScripting *scriptIface, + IGameDef *gamedef, const std::string &path_world); + ~ServerEnvironment(); + + Map & getMap(); + + ServerMap & getServerMap(); + + //TODO find way to remove this fct! + GameScripting* getScriptIface() + { return m_script; } + + IGameDef *getGameDef() + { return m_gamedef; } + + float getSendRecommendedInterval() + { return m_recommended_send_interval; } + + void kickAllPlayers(AccessDeniedCode reason, + const std::string &str_reason, bool reconnect); + // Save players + void saveLoadedPlayers(); + void savePlayer(RemotePlayer *player); + RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao); + void addPlayer(RemotePlayer *player); + void removePlayer(RemotePlayer *player); + + /* + Save and load time of day and game timer + */ + void saveMeta(); + void loadMeta(); + // to be called instead of loadMeta if + // env_meta.txt doesn't exist (e.g. new world) + void loadDefaultMeta(); + + u32 addParticleSpawner(float exptime); + u32 addParticleSpawner(float exptime, u16 attached_id); + void deleteParticleSpawner(u32 id, bool remove_from_object = true); + + /* + External ActiveObject interface + ------------------------------------------- + */ + + ServerActiveObject* getActiveObject(u16 id); + + /* + Add an active object to the environment. + Environment handles deletion of object. + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObject(ServerActiveObject *object); + + /* + Add an active object as a static object to the corresponding + MapBlock. + Caller allocates memory, ServerEnvironment frees memory. + Return value: true if succeeded, false if failed. + (note: not used, pending removal from engine) + */ + //bool addActiveObjectAsStatic(ServerActiveObject *object); + + /* + Find out what new objects have been added to + inside a radius around a position + */ + void getAddedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set ¤t_objects, + std::queue &added_objects); + + /* + Find out what new objects have been removed from + inside a radius around a position + */ + void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, + s16 player_radius, + std::set ¤t_objects, + std::queue &removed_objects); + + /* + Get the next message emitted by some active object. + Returns a message with id=0 if no messages are available. + */ + ActiveObjectMessage getActiveObjectMessage(); + + /* + Activate objects and dynamically modify for the dtime determined + from timestamp and additional_dtime + */ + void activateBlock(MapBlock *block, u32 additional_dtime=0); + + /* + {Active,Loading}BlockModifiers + ------------------------------------------- + */ + + void addActiveBlockModifier(ActiveBlockModifier *abm); + void addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm); + + /* + Other stuff + ------------------------------------------- + */ + + // Script-aware node setters + bool setNode(v3s16 p, const MapNode &n); + bool removeNode(v3s16 p); + bool swapNode(v3s16 p, const MapNode &n); + + // Find all active objects inside a radius around a point + void getObjectsInsideRadius(std::vector &objects, v3f pos, float radius); + + // Clear objects, loading and going through every MapBlock + void clearObjects(ClearObjectsMode mode); + + // This makes stuff happen + void step(f32 dtime); + + //check if there's a line of sight between two positions + bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL); + + u32 getGameTime() { return m_game_time; } + + void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } + float getMaxLagEstimate() { return m_max_lag_estimate; } + + std::set* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; + + // Sets the static object status all the active objects in the specified block + // This is only really needed for deleting blocks from the map + void setStaticForActiveObjectsInBlock(v3s16 blockpos, + bool static_exists, v3s16 static_block=v3s16(0,0,0)); + + RemotePlayer *getPlayer(const u16 peer_id); + RemotePlayer *getPlayer(const char* name); +private: + + /* + Internal ActiveObject interface + ------------------------------------------- + */ + + /* + Add an active object to the environment. + + Called by addActiveObject. + + Object may be deleted by environment immediately. + If id of object is 0, assigns a free id to it. + Returns the id of the object. + Returns 0 if not added and thus deleted. + */ + u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s); + + /* + Remove all objects that satisfy (m_removed && m_known_by_count==0) + */ + void removeRemovedObjects(); + + /* + Convert stored objects from block to active + */ + void activateObjects(MapBlock *block, u32 dtime_s); + + /* + Convert objects that are not in active blocks to static. + + If m_known_by_count != 0, active object is not deleted, but static + data is still updated. + + If force_delete is set, active object is deleted nevertheless. It + shall only be set so in the destructor of the environment. + */ + void deactivateFarObjects(bool force_delete); + + /* + Member variables + */ + + // The map + ServerMap *m_map; + // Lua state + GameScripting* m_script; + // Game definition + IGameDef *m_gamedef; + // World path + const std::string m_path_world; + // Active object list + ActiveObjectMap m_active_objects; + // Outgoing network message buffer for active objects + std::queue m_active_object_messages; + // Some timers + float m_send_recommended_timer; + IntervalLimiter m_object_management_interval; + // List of active blocks + ActiveBlockList m_active_blocks; + IntervalLimiter m_active_blocks_management_interval; + IntervalLimiter m_active_block_modifier_interval; + IntervalLimiter m_active_blocks_nodemetadata_interval; + int m_active_block_interval_overload_skip; + // Time from the beginning of the game in seconds. + // Incremented in step(). + u32 m_game_time; + // A helper variable for incrementing the latter + float m_game_time_fraction_counter; + // Time of last clearObjects call (game time). + // When a mapblock older than this is loaded, its objects are cleared. + u32 m_last_clear_objects_time; + // Active block modifiers + std::vector m_abms; + LBMManager m_lbm_mgr; + // An interval for generally sending object positions and stuff + float m_recommended_send_interval; + // Estimate for general maximum lag as determined by server. + // Can raise to high values like 15s with eg. map generation mods. + float m_max_lag_estimate; + + // peer_ids in here should be unique, except that there may be many 0s + std::vector m_players; + + // Particles + IntervalLimiter m_particle_management_interval; + UNORDERED_MAP m_particle_spawners; + UNORDERED_MAP m_particle_spawner_attachments; +}; + +#endif diff --git a/src/treegen.cpp b/src/treegen.cpp index f37bf0e86..4df574f34 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -21,9 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/pointer.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "map.h" -#include "environment.h" +#include "serverenvironment.h" #include "nodedef.h" #include "treegen.h" From 1fee649f1586c39510169f4dbc84b6c7aed12cfd Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Sun, 8 Jan 2017 09:32:16 -0800 Subject: [PATCH 038/586] Minor: Fix indentation in serverenvironment.cpp --- src/serverenvironment.cpp | 106 +++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 6229e4cf1..c9fa64ec5 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -770,65 +770,65 @@ public: v3s16 p0; for(p0.X=0; p0.XgetNodeUnsafe(p0); + content_t c = n.getContent(); + + if (c >= m_aabms.size() || !m_aabms[c]) + continue; + + v3s16 p = p0 + block->getPosRelative(); + for(std::vector::iterator + i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { + if(myrand() % i->chance != 0) + continue; + + // Check neighbors + if(!i->required_neighbors.empty()) { - const MapNode &n = block->getNodeUnsafe(p0); - content_t c = n.getContent(); - - if (c >= m_aabms.size() || !m_aabms[c]) - continue; - - v3s16 p = p0 + block->getPosRelative(); - for(std::vector::iterator - i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { - if(myrand() % i->chance != 0) - continue; - - // Check neighbors - if(!i->required_neighbors.empty()) - { - v3s16 p1; - for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) - for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) - for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) - { - if(p1 == p0) - continue; - content_t c; - if (block->isValidPosition(p1)) { - // if the neighbor is found on the same map block - // get it straight from there - const MapNode &n = block->getNodeUnsafe(p1); - c = n.getContent(); - } else { - // otherwise consult the map - MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); - c = n.getContent(); - } - std::set::const_iterator k; - k = i->required_neighbors.find(c); - if(k != i->required_neighbors.end()){ - goto neighbor_found; - } - } - // No required neighbor found + v3s16 p1; + for(p1.X = p0.X-1; p1.X <= p0.X+1; p1.X++) + for(p1.Y = p0.Y-1; p1.Y <= p0.Y+1; p1.Y++) + for(p1.Z = p0.Z-1; p1.Z <= p0.Z+1; p1.Z++) + { + if(p1 == p0) continue; + content_t c; + if (block->isValidPosition(p1)) { + // if the neighbor is found on the same map block + // get it straight from there + const MapNode &n = block->getNodeUnsafe(p1); + c = n.getContent(); + } else { + // otherwise consult the map + MapNode n = map->getNodeNoEx(p1 + block->getPosRelative()); + c = n.getContent(); } - neighbor_found: - - // Call all the trigger variations - i->abm->trigger(m_env, p, n); - i->abm->trigger(m_env, p, n, - active_object_count, active_object_count_wider); - - // Count surrounding objects again if the abms added any - if(m_env->m_added_objects > 0) { - active_object_count = countObjects(block, map, active_object_count_wider); - m_env->m_added_objects = 0; + std::set::const_iterator k; + k = i->required_neighbors.find(c); + if(k != i->required_neighbors.end()){ + goto neighbor_found; } } + // No required neighbor found + continue; } + neighbor_found: + + // Call all the trigger variations + i->abm->trigger(m_env, p, n); + i->abm->trigger(m_env, p, n, + active_object_count, active_object_count_wider); + + // Count surrounding objects again if the abms added any + if(m_env->m_added_objects > 0) { + active_object_count = countObjects(block, map, active_object_count_wider); + m_env->m_added_objects = 0; + } + } + } } }; From ddcf8422a229c4965233177f6315847a6773a20c Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 27 Dec 2016 17:00:47 +0000 Subject: [PATCH 039/586] Map generation limit: Fix checks for block/sector over-limit Fix the maths that check if any part of a mapblock or sector is over the set map_generation_limit. Therefore avoid the loading of any over-limit blocks that were previously generated when map_generation_limit was larger. The set limit can vary for a world because it is not yet a per-world mapgen parameter, even when it is sometimes it will be changed deliberately. Therefore avoid a player being returned to world centre if they re-enter a world while being over-limit. Fix the createSector() crash caused by a mob spawning over-limit in an over-limit mapblock --- src/map.cpp | 21 ++++++++++++++++----- src/mapblock.h | 29 ++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index 53657ce6b..d4115887f 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2064,15 +2064,26 @@ ServerMapSector *ServerMap::createSector(v2s16 p2d) return sector; } #endif + /* - Do not create over-limit + Do not create over-limit. + We are checking for any nodes of the mapblocks of the sector being beyond the limit. + A sector is a vertical column of mapblocks, so sectorpos is like a 2D blockpos. + + At the negative limit we are checking for + block minimum nodepos < -mapgenlimit. + At the positive limit we are checking for + block maximum nodepos > mapgenlimit. + + Block minimum nodepos = blockpos * mapblocksize. + Block maximum nodepos = (blockpos + 1) * mapblocksize - 1. */ const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")); - if(p2d.X < -map_gen_limit / MAP_BLOCKSIZE - || p2d.X > map_gen_limit / MAP_BLOCKSIZE - || p2d.Y < -map_gen_limit / MAP_BLOCKSIZE - || p2d.Y > map_gen_limit / MAP_BLOCKSIZE) + if (p2d.X * MAP_BLOCKSIZE < -map_gen_limit + || (p2d.X + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit + || p2d.Y * MAP_BLOCKSIZE < -map_gen_limit + || (p2d.Y + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit) throw InvalidPositionException("createSector(): pos. over limit"); /* diff --git a/src/mapblock.h b/src/mapblock.h index c737b4c37..d46b7b880 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -656,23 +656,34 @@ inline bool objectpos_over_limit(v3f p) const static float map_gen_limit_bs = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")) * BS; return (p.X < -map_gen_limit_bs - || p.X > map_gen_limit_bs + || p.X > map_gen_limit_bs || p.Y < -map_gen_limit_bs - || p.Y > map_gen_limit_bs + || p.Y > map_gen_limit_bs || p.Z < -map_gen_limit_bs - || p.Z > map_gen_limit_bs); + || p.Z > map_gen_limit_bs); } +/* + We are checking for any node of the mapblock being beyond the limit. + + At the negative limit we are checking for + block minimum nodepos < -mapgenlimit. + At the positive limit we are checking for + block maximum nodepos > mapgenlimit. + + Block minimum nodepos = blockpos * mapblocksize. + Block maximum nodepos = (blockpos + 1) * mapblocksize - 1. +*/ inline bool blockpos_over_limit(v3s16 p) { const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")); - return (p.X < -map_gen_limit / MAP_BLOCKSIZE - || p.X > map_gen_limit / MAP_BLOCKSIZE - || p.Y < -map_gen_limit / MAP_BLOCKSIZE - || p.Y > map_gen_limit / MAP_BLOCKSIZE - || p.Z < -map_gen_limit / MAP_BLOCKSIZE - || p.Z > map_gen_limit / MAP_BLOCKSIZE); + return (p.X * MAP_BLOCKSIZE < -map_gen_limit + || (p.X + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit + || p.Y * MAP_BLOCKSIZE < -map_gen_limit + || (p.Y + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit + || p.Z * MAP_BLOCKSIZE < -map_gen_limit + || (p.Z + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit); } /* From 8c1b4f298e2812598b0350e8c86b6a0788062ed7 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 7 Jan 2017 21:24:31 +0000 Subject: [PATCH 040/586] Map generation limit: Cache as 'const' not 'const static' --- src/map.cpp | 2 +- src/mapblock.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index d4115887f..0659f66aa 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2078,7 +2078,7 @@ ServerMapSector *ServerMap::createSector(v2s16 p2d) Block minimum nodepos = blockpos * mapblocksize. Block maximum nodepos = (blockpos + 1) * mapblocksize - 1. */ - const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, + const u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")); if (p2d.X * MAP_BLOCKSIZE < -map_gen_limit || (p2d.X + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit diff --git a/src/mapblock.h b/src/mapblock.h index d46b7b880..f80800109 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -653,7 +653,7 @@ typedef std::vector MapBlockVect; inline bool objectpos_over_limit(v3f p) { - const static float map_gen_limit_bs = MYMIN(MAX_MAP_GENERATION_LIMIT, + const float map_gen_limit_bs = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")) * BS; return (p.X < -map_gen_limit_bs || p.X > map_gen_limit_bs @@ -676,7 +676,7 @@ inline bool objectpos_over_limit(v3f p) */ inline bool blockpos_over_limit(v3s16 p) { - const static u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, + const u16 map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT, g_settings->getU16("map_generation_limit")); return (p.X * MAP_BLOCKSIZE < -map_gen_limit || (p.X + 1) * MAP_BLOCKSIZE - 1 > map_gen_limit From 73fdb635974cb11521d80f15261b97d6fac53cd0 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 9 Jan 2017 16:39:40 +0100 Subject: [PATCH 041/586] builtin/.../falling.lua: Avoid crash when hitting unknown nodes --- builtin/game/falling.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 4696ce481..39a74008c 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -83,7 +83,7 @@ core.register_entity(":__builtin:falling_node", { -- it's drops if n2.name ~= "air" and (not nd or nd.liquidtype == "none") then core.remove_node(np) - if nd.buildable_to == false then + if nd and nd.buildable_to == false then -- Add dropped items local drops = core.get_node_drops(n2.name, "") for _, dropped_item in pairs(drops) do From 11df7e886a674e280e3ec6f895c11fc1e70eb7b3 Mon Sep 17 00:00:00 2001 From: zeuner Date: Mon, 9 Jan 2017 17:03:13 +0100 Subject: [PATCH 042/586] support older PostGreSQL versions (#4999) * support older PostGreSQL versions * documentation accuracy * improve performance by affecting less rows in UPDATE queries --- README.txt | 2 +- src/database-postgresql.cpp | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/README.txt b/README.txt index 8bd8554ed..4c02763ca 100644 --- a/README.txt +++ b/README.txt @@ -178,7 +178,7 @@ ENABLE_FREETYPE - Build with FreeType2; Allows using TTF fonts ENABLE_GETTEXT - Build with Gettext; Allows using translations ENABLE_GLES - Search for Open GLES headers & libraries and use them ENABLE_LEVELDB - Build with LevelDB; Enables use of LevelDB map backend -ENABLE_POSTGRESQL - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater required) +ENABLE_POSTGRESQL - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater recommended) ENABLE_REDIS - Build with libhiredis; Enables use of Redis map backend ENABLE_SPATIAL - Build with LibSpatial; Speeds up AreaStores ENABLE_SOUND - Build with OpenAL, libogg & libvorbis; in-game Sounds diff --git a/src/database-postgresql.cpp b/src/database-postgresql.cpp index 3b6b42aea..03a69566b 100644 --- a/src/database-postgresql.cpp +++ b/src/database-postgresql.cpp @@ -80,12 +80,12 @@ void Database_PostgreSQL::connectToDatabase() /* * We are using UPSERT feature from PostgreSQL 9.5 - * to have the better performance, - * set the minimum version to 90500 + * to have the better performance where possible. */ if (m_pgversion < 90500) { - throw DatabaseException("PostgreSQL database error: " - "Server version 9.5 or greater required."); + warningstream << "Your PostgreSQL server lacks UPSERT " + << "support. Use version 9.5 or better if possible." + << std::endl; } infostream << "PostgreSQL Database: Version " << m_pgversion @@ -125,11 +125,25 @@ void Database_PostgreSQL::initStatements() "WHERE posX = $1::int4 AND posY = $2::int4 AND " "posZ = $3::int4"); - prepareStatement("write_block", + if (m_pgversion < 90500) { + prepareStatement("write_block_insert", + "INSERT INTO blocks (posX, posY, posZ, data) SELECT " + "$1::int4, $2::int4, $3::int4, $4::bytea " + "WHERE NOT EXISTS (SELECT true FROM blocks " + "WHERE posX = $1::int4 AND posY = $2::int4 AND " + "posZ = $3::int4)"); + + prepareStatement("write_block_update", + "UPDATE blocks SET data = $4::bytea " + "WHERE posX = $1::int4 AND posY = $2::int4 AND " + "posZ = $3::int4"); + } else { + prepareStatement("write_block", "INSERT INTO blocks (posX, posY, posZ, data) VALUES " "($1::int4, $2::int4, $3::int4, $4::bytea) " "ON CONFLICT ON CONSTRAINT blocks_pkey DO " "UPDATE SET data = $4::bytea"); + } prepareStatement("delete_block", "DELETE FROM blocks WHERE " "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4"); @@ -218,7 +232,12 @@ bool Database_PostgreSQL::saveBlock(const v3s16 &pos, }; const int argFmt[] = { 1, 1, 1, 1 }; - execPrepared("write_block", ARRLEN(args), args, argLen, argFmt); + if (m_pgversion < 90500) { + execPrepared("write_block_update", ARRLEN(args), args, argLen, argFmt); + execPrepared("write_block_insert", ARRLEN(args), args, argLen, argFmt); + } else { + execPrepared("write_block", ARRLEN(args), args, argLen, argFmt); + } return true; } From 8e7449e09253e138716d8dbad6a2ab5c6e089e28 Mon Sep 17 00:00:00 2001 From: Ner'zhul Date: Mon, 9 Jan 2017 20:39:22 +0100 Subject: [PATCH 043/586] Environment & IGameDef code refactoring (#4985) * Environment code refactoring * Cleanup includes & class declarations in client & server environment to improve build speed * ServerEnvironment::m_gamedef is now a pointer to Server instead of IGameDef, permitting to cleanup many casts. * Cleanup IGameDef * Move ITextureSource* IGameDef::getTextureSource() to Client only. * Also move ITextureSource *IGameDef::tsrc() helper * drop getShaderSource, getSceneManager, getSoundManager & getCamera abstract call * drop unused emerge() call * cleanup server unused functions (mentionned before) * Drop one unused parameter from ContentFeatures::updateTextures * move checkLocalPrivilege to Client * Remove some unnecessary casts * create_formspec_menu: remove IWritableTextureSource pointer, as client already knows it * Fix some comments * Change required IGameDef to Server/Client pointers * Previous change that game.cpp sometimes calls functions with Client + InventoryManager + IGameDef in same functions but it's the same objects * Remove duplicate Client pointer in GUIFormSpecMenu::GUIFormSpecMenu * drop ClientMap::sectorWasDrawn which is unused --- build/android/jni/Android.mk | 2 + src/camera.cpp | 21 +++++----- src/camera.h | 6 +-- src/client.cpp | 2 +- src/client.h | 17 ++++---- src/clientenvironment.cpp | 30 +++++++------- src/clientenvironment.h | 8 ++-- src/clientmap.cpp | 7 ++-- src/clientmap.h | 21 ++++------ src/clientobject.cpp | 9 ++--- src/clientobject.h | 21 +++------- src/collision.cpp | 3 ++ src/content_cao.cpp | 67 +++++++++++++++---------------- src/content_cao.h | 9 +++-- src/content_cso.cpp | 13 +----- src/content_mapblock.cpp | 6 +-- src/content_sao.cpp | 20 ++++----- src/emerge.cpp | 14 +++---- src/emerge.h | 3 +- src/environment.h | 7 ---- src/game.cpp | 59 ++++++++++++--------------- src/gamedef.h | 29 +------------ src/guiEngine.cpp | 2 - src/guiFormSpecMenu.cpp | 39 +++++++++--------- src/guiFormSpecMenu.h | 6 +-- src/hud.cpp | 20 +++++---- src/hud.h | 8 ++-- src/itemdef.cpp | 22 +++++----- src/itemdef.h | 9 +++-- src/localplayer.cpp | 23 +++++------ src/localplayer.h | 4 +- src/mapblock_mesh.cpp | 25 ++++++------ src/mapblock_mesh.h | 8 ++-- src/mg_biome.cpp | 11 +++-- src/mg_biome.h | 5 ++- src/mg_schematic.cpp | 10 ++--- src/mg_schematic.h | 6 +-- src/nodedef.cpp | 16 ++++---- src/nodedef.h | 4 +- src/particles.cpp | 16 +++----- src/particles.h | 2 +- src/pathfinder.cpp | 6 +-- src/script/lua_api/l_nodemeta.cpp | 6 +-- src/server.cpp | 18 --------- src/server.h | 6 +-- src/serverenvironment.cpp | 20 ++++----- src/serverenvironment.h | 12 +++--- src/wieldmesh.cpp | 26 ++++++------ src/wieldmesh.h | 6 +-- 49 files changed, 301 insertions(+), 409 deletions(-) diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 2567457b9..3be856770 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -117,6 +117,7 @@ LOCAL_SRC_FILES := \ jni/src/cavegen.cpp \ jni/src/chat.cpp \ jni/src/client.cpp \ + jni/src/clientenvironment.cpp \ jni/src/clientiface.cpp \ jni/src/clientmap.cpp \ jni/src/clientmedia.cpp \ @@ -210,6 +211,7 @@ LOCAL_SRC_FILES := \ jni/src/rollback_interface.cpp \ jni/src/serialization.cpp \ jni/src/server.cpp \ + jni/src/serverenvironment.cpp \ jni/src/serverlist.cpp \ jni/src/serverobject.cpp \ jni/src/shader.cpp \ diff --git a/src/camera.cpp b/src/camera.cpp index 43980db1c..4768e8778 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -27,7 +27,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "wieldmesh.h" #include "noise.h" // easeCurve -#include "gamedef.h" #include "sound.h" #include "event.h" #include "profiler.h" @@ -41,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, - IGameDef *gamedef): + Client *client): m_playernode(NULL), m_headnode(NULL), m_cameranode(NULL), @@ -50,7 +49,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, m_wieldnode(NULL), m_draw_control(draw_control), - m_gamedef(gamedef), + m_client(client), m_camera_position(0,0,0), m_camera_direction(0,0,0), @@ -88,7 +87,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, m_wieldmgr = smgr->createNewSceneManager(); m_wieldmgr->addCameraSceneNode(); m_wieldnode = new WieldMeshSceneNode(m_wieldmgr->getRootSceneNode(), m_wieldmgr, -1, false); - m_wieldnode->setItem(ItemStack(), m_gamedef); + m_wieldnode->setItem(ItemStack(), m_client); m_wieldnode->drop(); // m_wieldmgr grabbed it /* TODO: Add a callback function so these can be updated when a setting @@ -151,7 +150,7 @@ void Camera::step(f32 dtime) m_wield_change_timer = MYMIN(m_wield_change_timer + dtime, 0.125); if (m_wield_change_timer >= 0 && was_under_zero) - m_wieldnode->setItem(m_wield_item_next, m_gamedef); + m_wieldnode->setItem(m_wield_item_next, m_client); if (m_view_bobbing_state != 0) { @@ -189,7 +188,7 @@ void Camera::step(f32 dtime) (was > 0.5f && m_view_bobbing_anim <= 0.5f)); if(step) { MtEvent *e = new SimpleTriggerEvent("ViewBobbingStep"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } } @@ -210,10 +209,10 @@ void Camera::step(f32 dtime) if(m_digging_button == 0) { MtEvent *e = new SimpleTriggerEvent("CameraPunchLeft"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } else if(m_digging_button == 1) { MtEvent *e = new SimpleTriggerEvent("CameraPunchRight"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } } @@ -352,7 +351,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, my_cp.Y = m_camera_position.Y + (m_camera_direction.Y*-i); // Prevent camera positioned inside nodes - INodeDefManager *nodemgr = m_gamedef->ndef(); + INodeDefManager *nodemgr = m_client->ndef(); MapNode n = c_env.getClientMap().getNodeNoEx(floatToInt(my_cp, BS)); const ContentFeatures& features = nodemgr->get(n); if(features.walkable) @@ -390,7 +389,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, // Get FOV f32 fov_degrees; - if (player->getPlayerControl().zoom && m_gamedef->checkLocalPrivilege("zoom")) { + if (player->getPlayerControl().zoom && m_client->checkLocalPrivilege("zoom")) { fov_degrees = m_cache_zoom_fov; } else { fov_degrees = m_cache_fov; @@ -468,7 +467,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, const bool climbing = movement_Y && player->is_climbing; if ((walking || swimming || climbing) && m_cache_view_bobbing && - (!g_settings->getBool("free_move") || !m_gamedef->checkLocalPrivilege("fly"))) + (!g_settings->getBool("free_move") || !m_client->checkLocalPrivilege("fly"))) { // Start animation m_view_bobbing_state = 1; diff --git a/src/camera.h b/src/camera.h index cb0e9686d..b5be26718 100644 --- a/src/camera.h +++ b/src/camera.h @@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class LocalPlayer; struct MapDrawControl; -class IGameDef; +class Client; class WieldMeshSceneNode; struct Nametag { @@ -61,7 +61,7 @@ class Camera { public: Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, - IGameDef *gamedef); + Client *client); ~Camera(); // Get player scene node. @@ -189,7 +189,7 @@ private: // draw control MapDrawControl& m_draw_control; - IGameDef *m_gamedef; + Client *m_client; video::IVideoDriver *m_driver; // Absolute camera position diff --git a/src/client.cpp b/src/client.cpp index 693a90604..c2471dbd7 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -221,7 +221,7 @@ Client::Client( m_event(event), m_mesh_update_thread(), m_env( - new ClientMap(this, this, control, + new ClientMap(this, control, device->getSceneManager()->getRootSceneNode(), device->getSceneManager(), 666), device->getSceneManager(), diff --git a/src/client.h b/src/client.h index 9a09704a6..df3e7e605 100644 --- a/src/client.h +++ b/src/client.h @@ -34,7 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include "hud.h" #include "particles.h" -#include "network/networkpacket.h" struct MeshMakeData; class MapBlockMesh; @@ -51,6 +50,7 @@ class Database; class Mapper; struct MinimapMapblock; class Camera; +class NetworkPacket; struct QueuedMeshUpdate { @@ -402,9 +402,6 @@ public: void ProcessData(NetworkPacket *pkt); - // Returns true if something was received - bool AsyncProcessPacket(); - bool AsyncProcessData(); void Send(NetworkPacket* pkt); void interact(u8 action, const PointedThing& pointed); @@ -422,8 +419,9 @@ public: void sendRespawn(); void sendReady(); - ClientEnvironment& getEnv() - { return m_env; } + ClientEnvironment& getEnv() { return m_env; } + ITextureSource *tsrc() { return getTextureSource(); } + ISoundManager *sound() { return getSoundManager(); } // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) void removeNode(v3s16 p); @@ -521,14 +519,15 @@ public: virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); + ITextureSource* getTextureSource(); virtual IShaderSource* getShaderSource(); - virtual scene::ISceneManager* getSceneManager(); + IShaderSource *shsrc() { return getShaderSource(); } + scene::ISceneManager* getSceneManager(); virtual u16 allocateUnknownNodeId(const std::string &name); virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); virtual ParticleManager* getParticleManager(); - virtual bool checkLocalPrivilege(const std::string &priv) + bool checkLocalPrivilege(const std::string &priv) { return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename); diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp index e831de109..65646c6b4 100644 --- a/src/clientenvironment.cpp +++ b/src/clientenvironment.cpp @@ -34,13 +34,13 @@ with this program; if not, write to the Free Software Foundation, Inc., */ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, + ITextureSource *texturesource, Client *client, IrrlichtDevice *irr): m_map(map), m_local_player(NULL), m_smgr(smgr), m_texturesource(texturesource), - m_gamedef(gamedef), + m_client(client), m_irr(irr) { char zero = 0; @@ -94,7 +94,7 @@ void ClientEnvironment::step(float dtime) stepTimeOfDay(dtime); // Get some settings - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); + bool fly_allowed = m_client->checkLocalPrivilege("fly"); bool free_move = fly_allowed && g_settings->getBool("free_move"); // Get local player @@ -223,7 +223,7 @@ void ClientEnvironment::step(float dtime) f32 post_factor = 1; // 1 hp per node/s if(info.type == COLLISION_NODE) { - const ContentFeatures &f = m_gamedef->ndef()-> + const ContentFeatures &f = m_client->ndef()-> get(m_map->getNodeNoEx(info.node_p)); // Determine fall damage multiplier int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); @@ -237,7 +237,7 @@ void ClientEnvironment::step(float dtime) if(damage != 0){ damageLocalPlayer(damage, true); MtEvent *e = new SimpleTriggerEvent("PlayerFallingDamage"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } } @@ -259,11 +259,11 @@ void ClientEnvironment::step(float dtime) u32 damage_per_second = 0; damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n1).damage_per_second); + m_client->ndef()->get(n1).damage_per_second); damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n2).damage_per_second); + m_client->ndef()->get(n2).damage_per_second); damage_per_second = MYMAX(damage_per_second, - m_gamedef->ndef()->get(n3).damage_per_second); + m_client->ndef()->get(n3).damage_per_second); if(damage_per_second != 0) { @@ -272,7 +272,7 @@ void ClientEnvironment::step(float dtime) } // Protocol v29 make this behaviour obsolete - if (((Client*) getGameDef())->getProtoVersion() < 29) { + if (getGameDef()->getProtoVersion() < 29) { /* Drowning */ @@ -282,7 +282,7 @@ void ClientEnvironment::step(float dtime) // head v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); + ContentFeatures c = m_client->ndef()->get(n); u8 drowning_damage = c.drowning; if (drowning_damage > 0 && lplayer->hp > 0) { u16 breath = lplayer->getBreath(); @@ -306,7 +306,7 @@ void ClientEnvironment::step(float dtime) // head v3s16 p = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); MapNode n = m_map->getNodeNoEx(p); - ContentFeatures c = m_gamedef->ndef()->get(n); + ContentFeatures c = m_client->ndef()->get(n); if (!lplayer->hp) { lplayer->setBreath(11); } else if (c.drowning == 0) { @@ -332,7 +332,7 @@ void ClientEnvironment::step(float dtime) v3s16 p = lplayer->getLightPosition(); node_at_lplayer = m_map->getNodeNoEx(p); - u16 light = getInteriorLight(node_at_lplayer, 0, m_gamedef->ndef()); + u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); u8 day = light & 0xff; u8 night = (light >> 8) & 0xff; finalColorBlend(lplayer->light_color, day, night, day_night_ratio); @@ -360,7 +360,7 @@ void ClientEnvironment::step(float dtime) v3s16 p = obj->getLightPosition(); MapNode n = m_map->getNodeNoEx(p, &pos_ok); if (pos_ok) - light = n.getLightBlend(day_night_ratio, m_gamedef->ndef()); + light = n.getLightBlend(day_night_ratio, m_client->ndef()); else light = blend_light(day_night_ratio, LIGHT_SUN, 0); @@ -467,7 +467,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) v3s16 p = object->getLightPosition(); MapNode n = m_map->getNodeNoEx(p, &pos_ok); if (pos_ok) - light = n.getLightBlend(getDayNightRatio(), m_gamedef->ndef()); + light = n.getLightBlend(getDayNightRatio(), m_client->ndef()); else light = blend_light(getDayNightRatio(), LIGHT_SUN, 0); @@ -480,7 +480,7 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type, const std::string &init_data) { ClientActiveObject* obj = - ClientActiveObject::create((ActiveObjectType) type, m_gamedef, this); + ClientActiveObject::create((ActiveObjectType) type, m_client, this); if(obj == NULL) { infostream<<"ClientEnvironment::addActiveObject(): " diff --git a/src/clientenvironment.h b/src/clientenvironment.h index e6292b5b7..b30a7a6d7 100644 --- a/src/clientenvironment.h +++ b/src/clientenvironment.h @@ -30,6 +30,7 @@ class ClientMap; class ClientActiveObject; class GenericCAO; class LocalPlayer; +struct PointedThing; /* The client-side environment. @@ -66,15 +67,14 @@ class ClientEnvironment : public Environment { public: ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr, - ITextureSource *texturesource, IGameDef *gamedef, + ITextureSource *texturesource, Client *client, IrrlichtDevice *device); ~ClientEnvironment(); Map & getMap(); ClientMap & getClientMap(); - IGameDef *getGameDef() - { return m_gamedef; } + Client *getGameDef() { return m_client; } void step(f32 dtime); @@ -175,7 +175,7 @@ private: LocalPlayer *m_local_player; scene::ISceneManager *m_smgr; ITextureSource *m_texturesource; - IGameDef *m_gamedef; + Client *m_client; IrrlichtDevice *m_irr; UNORDERED_MAP m_active_objects; std::vector m_simple_objects; diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 542eb03e8..7e688daad 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -35,13 +35,12 @@ with this program; if not, write to the Free Software Foundation, Inc., ClientMap::ClientMap( Client *client, - IGameDef *gamedef, MapDrawControl &control, scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id ): - Map(dout_client, gamedef), + Map(dout_client, client), scene::ISceneNode(parent, mgr, id), m_client(client), m_control(control), @@ -140,7 +139,7 @@ static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac, return false; } -void ClientMap::getBlocksInViewRange(v3s16 cam_pos_nodes, +void ClientMap::getBlocksInViewRange(v3s16 cam_pos_nodes, v3s16 *p_blocks_min, v3s16 *p_blocks_max) { v3s16 box_nodes_d = m_control.wanted_range * v3s16(1, 1, 1); @@ -766,7 +765,7 @@ void ClientMap::renderPostFx(CameraMode cam_mode) const ContentFeatures& features = m_nodedef->get(n); video::SColor post_effect_color = features.post_effect_color; if(features.solidness == 2 && !(g_settings->getBool("noclip") && - m_gamedef->checkLocalPrivilege("noclip")) && + m_client->checkLocalPrivilege("noclip")) && cam_mode == CAMERA_MODE_FIRST) { post_effect_color = video::SColor(255, 0, 0, 0); diff --git a/src/clientmap.h b/src/clientmap.h index cb686ff33..84228f4ca 100644 --- a/src/clientmap.h +++ b/src/clientmap.h @@ -59,7 +59,7 @@ class ITextureSource; /* ClientMap - + This is the only map class that is able to render itself on screen. */ @@ -68,7 +68,6 @@ class ClientMap : public Map, public scene::ISceneNode public: ClientMap( Client *client, - IGameDef *gamedef, MapDrawControl &control, scene::ISceneNode* parent, scene::ISceneManager* mgr, @@ -114,13 +113,13 @@ public: driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); renderMap(driver, SceneManager->getSceneNodeRenderPass()); } - + virtual const aabb3f &getBoundingBox() const { return m_box; } - - void getBlocksInViewRange(v3s16 cam_pos_nodes, + + void getBlocksInViewRange(v3s16 cam_pos_nodes, v3s16 *p_blocks_min, v3s16 *p_blocks_max); void updateDrawList(video::IVideoDriver* driver); void renderMap(video::IVideoDriver* driver, s32 pass); @@ -132,20 +131,14 @@ public: // For debug printing virtual void PrintInfo(std::ostream &out); - - // Check if sector was drawn on last render() - bool sectorWasDrawn(v2s16 p) - { - return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end()); - } const MapDrawControl & getControl() const { return m_control; } f32 getCameraFov() const { return m_camera_fov; } private: Client *m_client; - + aabb3f m_box; - + MapDrawControl &m_control; v3f m_camera_position; @@ -154,7 +147,7 @@ private: v3s16 m_camera_offset; std::map m_drawlist; - + std::set m_last_drawn_sectors; bool m_cache_trilinear_filter; diff --git a/src/clientobject.cpp b/src/clientobject.cpp index ff3f47187..89a0474a4 100644 --- a/src/clientobject.cpp +++ b/src/clientobject.cpp @@ -20,16 +20,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientobject.h" #include "debug.h" #include "porting.h" -#include "constants.h" /* ClientActiveObject */ -ClientActiveObject::ClientActiveObject(u16 id, IGameDef *gamedef, +ClientActiveObject::ClientActiveObject(u16 id, Client *client, ClientEnvironment *env): ActiveObject(id), - m_gamedef(gamedef), + m_client(client), m_env(env) { } @@ -40,7 +39,7 @@ ClientActiveObject::~ClientActiveObject() } ClientActiveObject* ClientActiveObject::create(ActiveObjectType type, - IGameDef *gamedef, ClientEnvironment *env) + Client *client, ClientEnvironment *env) { // Find factory function UNORDERED_MAP::iterator n = m_types.find(type); @@ -52,7 +51,7 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type, } Factory f = n->second; - ClientActiveObject *object = (*f)(gamedef, env); + ClientActiveObject *object = (*f)(client, env); return object; } diff --git a/src/clientobject.h b/src/clientobject.h index 83931e438..f0bde0adc 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -25,20 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/cpp11_container.h" -/* - -Some planning -------------- - -* Client receives a network packet with information of added objects - in it -* Client supplies the information to its ClientEnvironment -* The environment adds the specified objects to itself - -*/ - class ClientEnvironment; class ITextureSource; +class Client; class IGameDef; class LocalPlayer; struct ItemStack; @@ -47,7 +36,7 @@ class WieldMeshSceneNode; class ClientActiveObject : public ActiveObject { public: - ClientActiveObject(u16 id, IGameDef *gamedef, ClientEnvironment *env); + ClientActiveObject(u16 id, Client *client, ClientEnvironment *env); virtual ~ClientActiveObject(); virtual void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -89,7 +78,7 @@ public: virtual void initialize(const std::string &data){} // Create a certain type of ClientActiveObject - static ClientActiveObject* create(ActiveObjectType type, IGameDef *gamedef, + static ClientActiveObject* create(ActiveObjectType type, Client *client, ClientEnvironment *env); // If returns true, punch will not be sent to the server @@ -99,9 +88,9 @@ public: protected: // Used for creating objects based on type - typedef ClientActiveObject* (*Factory)(IGameDef *gamedef, ClientEnvironment *env); + typedef ClientActiveObject* (*Factory)(Client *client, ClientEnvironment *env); static void registerType(u16 type, Factory f); - IGameDef *m_gamedef; + Client *m_client; ClientEnvironment *m_env; private: // Used for creating objects based on type diff --git a/src/collision.cpp b/src/collision.cpp index 595fa8059..c0891c152 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -22,9 +22,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "nodedef.h" #include "gamedef.h" +#ifndef SERVER #include "clientenvironment.h" +#endif #include "serverenvironment.h" #include "serverobject.h" +#include "util/timetaker.h" #include "profiler.h" // float error is 10 - 9.96875 = 0.03125 diff --git a/src/content_cao.cpp b/src/content_cao.cpp index a02d5168e..a4c0bf14d 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -33,7 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "collision.h" #include "settings.h" #include "serialization.h" // For decompressZlib -#include "gamedef.h" #include "clientobject.h" #include "mesh.h" #include "itemdef.h" @@ -139,7 +138,7 @@ static void setBillboardTextureMatrix(scene::IBillboardSceneNode *bill, class TestCAO : public ClientActiveObject { public: - TestCAO(IGameDef *gamedef, ClientEnvironment *env); + TestCAO(Client *client, ClientEnvironment *env); virtual ~TestCAO(); ActiveObjectType getType() const @@ -147,7 +146,7 @@ public: return ACTIVEOBJECT_TYPE_TEST; } - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env); + static ClientActiveObject* create(Client *client, ClientEnvironment *env); void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, IrrlichtDevice *irr); @@ -169,8 +168,8 @@ private: // Prototype TestCAO proto_TestCAO(NULL, NULL); -TestCAO::TestCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +TestCAO::TestCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), m_node(NULL), m_position(v3f(0,10*BS,0)) { @@ -181,9 +180,9 @@ TestCAO::~TestCAO() { } -ClientActiveObject* TestCAO::create(IGameDef *gamedef, ClientEnvironment *env) +ClientActiveObject* TestCAO::create(Client *client, ClientEnvironment *env) { - return new TestCAO(gamedef, env); + return new TestCAO(client, env); } void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -283,7 +282,7 @@ void TestCAO::processMessage(const std::string &data) class ItemCAO : public ClientActiveObject { public: - ItemCAO(IGameDef *gamedef, ClientEnvironment *env); + ItemCAO(Client *client, ClientEnvironment *env); virtual ~ItemCAO(); ActiveObjectType getType() const @@ -291,7 +290,7 @@ public: return ACTIVEOBJECT_TYPE_ITEM; } - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env); + static ClientActiveObject* create(Client *client, ClientEnvironment *env); void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, IrrlichtDevice *irr); @@ -331,13 +330,13 @@ private: // Prototype ItemCAO proto_ItemCAO(NULL, NULL); -ItemCAO::ItemCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +ItemCAO::ItemCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), m_selection_box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.), m_node(NULL), m_position(v3f(0,10*BS,0)) { - if(!gamedef && !env) + if(!client && !env) { ClientActiveObject::registerType(getType(), create); } @@ -347,9 +346,9 @@ ItemCAO::~ItemCAO() { } -ClientActiveObject* ItemCAO::create(IGameDef *gamedef, ClientEnvironment *env) +ClientActiveObject* ItemCAO::create(Client *client, ClientEnvironment *env) { - return new ItemCAO(gamedef, env); + return new ItemCAO(client, env); } void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -433,7 +432,7 @@ void ItemCAO::updateNodePos() void ItemCAO::updateInfoText() { try{ - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(m_itemstring, idef); if(item.isKnown(idef)) @@ -458,10 +457,10 @@ void ItemCAO::updateTexture() std::istringstream is(m_itemstring, std::ios_base::binary); video::ITexture *texture = NULL; try{ - IItemDefManager *idef = m_gamedef->idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(is, idef); - texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_gamedef); + texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_client); } catch(SerializationError &e) { @@ -538,15 +537,15 @@ void ItemCAO::initialize(const std::string &data) #include "genericobject.h" -GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env): - ClientActiveObject(0, gamedef, env), +GenericCAO::GenericCAO(Client *client, ClientEnvironment *env): + ClientActiveObject(0, client, env), // m_is_player(false), m_is_local_player(false), // m_smgr(NULL), m_irr(NULL), - m_gamedef(NULL), + m_client(NULL), m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.), m_meshnode(NULL), m_animated_meshnode(NULL), @@ -581,10 +580,10 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env): m_last_light(255), m_is_visible(false) { - if (gamedef == NULL) { + if (client == NULL) { ClientActiveObject::registerType(getType(), create); } else { - m_gamedef = gamedef; + m_client = client; } } @@ -793,7 +792,7 @@ void GenericCAO::removeFromScene(bool permanent) } if (m_nametag) { - m_gamedef->getCamera()->removeNametag(m_nametag); + m_client->getCamera()->removeNametag(m_nametag); m_nametag = NULL; } } @@ -906,7 +905,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, } else if(m_prop.visual == "mesh") { infostream<<"GenericCAO::addToScene(): mesh"<getMesh(m_prop.mesh); + scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh); if(mesh) { m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL); @@ -937,12 +936,12 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, infostream<<"textures: "<= 1){ infostream<<"textures[0]: "<idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item(m_prop.textures[0], 1, 0, "", idef); m_wield_meshnode = new WieldMeshSceneNode( smgr->getRootSceneNode(), smgr, -1); - m_wield_meshnode->setItem(item, m_gamedef); + m_wield_meshnode->setItem(item, m_client); m_wield_meshnode->setScale(v3f(m_prop.visual_size.X/2, m_prop.visual_size.Y/2, @@ -959,7 +958,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, scene::ISceneNode *node = getSceneNode(); if (node && m_prop.nametag != "" && !m_is_local_player) { // Add nametag - m_nametag = m_gamedef->getCamera()->addNametag(node, + m_nametag = m_client->getCamera()->addNametag(node, m_prop.nametag, m_prop.nametag_color); } @@ -1058,11 +1057,11 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) // increase speed if using fast or flying fast if((g_settings->getBool("fast_move") && - m_gamedef->checkLocalPrivilege("fast")) && + m_client->checkLocalPrivilege("fast")) && (controls.aux1 || (!player->touching_ground && g_settings->getBool("free_move") && - m_gamedef->checkLocalPrivilege("fly")))) + m_client->checkLocalPrivilege("fly")))) new_speed *= 1.5; // slowdown speed if sneeking if(controls.sneak && walking) @@ -1129,7 +1128,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } removeFromScene(false); - addToScene(m_smgr, m_gamedef->tsrc(), m_irr); + addToScene(m_smgr, m_client->tsrc(), m_irr); // Attachments, part 2: Now that the parent has been refreshed, put its attachments back for (std::vector::size_type i = 0; i < m_children.size(); i++) { @@ -1199,12 +1198,12 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) m_step_distance_counter = 0; if(!m_is_local_player && m_prop.makes_footstep_sound) { - INodeDefManager *ndef = m_gamedef->ndef(); + INodeDefManager *ndef = m_client->ndef(); v3s16 p = floatToInt(getPosition() + v3f(0, (m_prop.collisionbox.MinEdge.Y-0.5)*BS, 0), BS); MapNode n = m_env->getMap().getNodeNoEx(p); SimpleSoundSpec spec = ndef->get(n).sound_footstep; - m_gamedef->sound()->playSoundAt(spec, false, getPosition()); + m_client->sound()->playSoundAt(spec, false, getPosition()); } } } @@ -1305,7 +1304,7 @@ void GenericCAO::updateTexturePos() void GenericCAO::updateTextures(const std::string &mod) { - ITextureSource *tsrc = m_gamedef->tsrc(); + ITextureSource *tsrc = m_client->tsrc(); bool use_trilinear_filter = g_settings->getBool("trilinear_filter"); bool use_bilinear_filter = g_settings->getBool("bilinear_filter"); @@ -1778,7 +1777,7 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, { assert(punchitem); // pre-condition const ToolCapabilities *toolcap = - &punchitem->getToolCapabilities(m_gamedef->idef()); + &punchitem->getToolCapabilities(m_client->idef()); PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, diff --git a/src/content_cao.h b/src/content_cao.h index a158e8296..96a160055 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemgroup.h" class Camera; +class Client; struct Nametag; /* @@ -68,7 +69,7 @@ private: // scene::ISceneManager *m_smgr; IrrlichtDevice *m_irr; - IGameDef *m_gamedef; + Client *m_client; aabb3f m_selection_box; scene::IMeshSceneNode *m_meshnode; scene::IAnimatedMeshSceneNode *m_animated_meshnode; @@ -109,13 +110,13 @@ private: std::vector m_children; public: - GenericCAO(IGameDef *gamedef, ClientEnvironment *env); + GenericCAO(Client *client, ClientEnvironment *env); ~GenericCAO(); - static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env) + static ClientActiveObject* create(Client *client, ClientEnvironment *env) { - return new GenericCAO(gamedef, env); + return new GenericCAO(client, env); } inline ActiveObjectType getType() const diff --git a/src/content_cso.cpp b/src/content_cso.cpp index c0407f460..aca71212b 100644 --- a/src/content_cso.cpp +++ b/src/content_cso.cpp @@ -21,20 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "client/tile.h" #include "clientenvironment.h" -#include "gamedef.h" +#include "client.h" #include "map.h" -/* -static void setBillboardTextureMatrix(scene::IBillboardSceneNode *bill, - float txs, float tys, int col, int row) -{ - video::SMaterial& material = bill->getMaterial(0); - core::matrix4& matrix = material.getTextureMatrix(0); - matrix.setTextureTranslate(txs*col, tys*row); - matrix.setTextureScale(txs, tys); -} -*/ - class SmokePuffCSO: public ClientSimpleObject { float m_age; diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 8ce0f1e0a..a7134590b 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/tile.h" #include "mesh.h" #include -#include "gamedef.h" +#include "client.h" #include "log.h" #include "noise.h" @@ -188,8 +188,8 @@ static inline int NeighborToIndex(const v3s16 &pos) void mapblock_mesh_generate_special(MeshMakeData *data, MeshCollector &collector) { - INodeDefManager *nodedef = data->m_gamedef->ndef(); - scene::ISceneManager* smgr = data->m_gamedef->getSceneManager(); + INodeDefManager *nodedef = data->m_client->ndef(); + scene::ISceneManager* smgr = data->m_client->getSceneManager(); scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator(); // 0ms diff --git a/src/content_sao.cpp b/src/content_sao.cpp index f866d4372..dd8bdc592 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -273,7 +273,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) v3f p_pos = m_base_position; v3f p_velocity = m_velocity; v3f p_acceleration = m_acceleration; - moveresult = collisionMoveSimple(m_env,m_env->getGameDef(), + moveresult = collisionMoveSimple(m_env, m_env->getGameDef(), pos_max_d, box, m_prop.stepheight, dtime, &p_pos, &p_velocity, p_acceleration, this, m_prop.collideWithObjects); @@ -945,7 +945,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) // get head position v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); MapNode n = m_env->getMap().getNodeNoEx(p); - const ContentFeatures &c = ((Server*) m_env->getGameDef())->ndef()->get(n); + const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n); // If node generates drown if (c.drowning > 0) { if (m_hp > 0 && m_breath > 0) @@ -954,7 +954,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) // No more breath, damage player if (m_breath == 0) { setHP(m_hp - c.drowning); - ((Server*) m_env->getGameDef())->SendPlayerHPOrDie(this); + m_env->getGameDef()->SendPlayerHPOrDie(this); } } } @@ -963,7 +963,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) // get head position v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS); MapNode n = m_env->getMap().getNodeNoEx(p); - const ContentFeatures &c = ((Server*) m_env->getGameDef())->ndef()->get(n); + const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n); // If player is alive & no drowning, breath if (m_hp > 0 && c.drowning == 0) setBreath(m_breath + 1); @@ -985,7 +985,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) m_attachment_position = v3f(0,0,0); m_attachment_rotation = v3f(0,0,0); setBasePosition(m_last_good_position); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } //dstream<<"PlayerSAO::step: dtime: "<getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::moveTo(v3f pos, bool continuous) @@ -1118,7 +1118,7 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) setBasePosition(pos); // Movement caused by this command is always valid m_last_good_position = pos; - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::setYaw(const float yaw) @@ -1148,7 +1148,7 @@ void PlayerSAO::setWantedRange(const s16 range) void PlayerSAO::setYawAndSend(const float yaw) { setYaw(yaw); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } void PlayerSAO::setPitch(const float pitch) @@ -1162,7 +1162,7 @@ void PlayerSAO::setPitch(const float pitch) void PlayerSAO::setPitchAndSend(const float pitch) { setPitch(pitch); - ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id); + m_env->getGameDef()->SendMovePlayer(m_peer_id); } int PlayerSAO::punch(v3f dir, @@ -1273,7 +1273,7 @@ void PlayerSAO::setBreath(const u16 breath, bool send) m_breath = MYMIN(breath, PLAYER_MAX_BREATH); if (send) - ((Server *) m_env->getGameDef())->SendPlayerBreath(this); + m_env->getGameDef()->SendPlayerBreath(this); } void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups) diff --git a/src/emerge.cpp b/src/emerge.cpp index 25b2e924b..3f0a46010 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -89,13 +89,13 @@ private: //// EmergeManager //// -EmergeManager::EmergeManager(IGameDef *gamedef) +EmergeManager::EmergeManager(Server *server) { - this->ndef = gamedef->getNodeDefManager(); - this->biomemgr = new BiomeManager(gamedef); - this->oremgr = new OreManager(gamedef); - this->decomgr = new DecorationManager(gamedef); - this->schemmgr = new SchematicManager(gamedef); + this->ndef = server->getNodeDefManager(); + this->biomemgr = new BiomeManager(server); + this->oremgr = new OreManager(server); + this->decomgr = new DecorationManager(server); + this->schemmgr = new SchematicManager(server); this->gen_notify_on = 0; // Note that accesses to this variable are not synchronized. @@ -128,7 +128,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef) m_qlimit_generate = 1; for (s16 i = 0; i < nthreads; i++) - m_threads.push_back(new EmergeThread((Server *)gamedef, i)); + m_threads.push_back(new EmergeThread(server, i)); infostream << "EmergeManager: using " << nthreads << " threads" << std::endl; } diff --git a/src/emerge.h b/src/emerge.h index 71ad97da3..76653e6cd 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -42,6 +42,7 @@ class BiomeManager; class OreManager; class DecorationManager; class SchematicManager; +class Server; // Structure containing inputs/outputs for chunk generation struct BlockMakeData { @@ -115,7 +116,7 @@ public: SchematicManager *schemmgr; // Methods - EmergeManager(IGameDef *gamedef); + EmergeManager(Server *server); ~EmergeManager(); bool initMapgens(MapgenParams *mgparams); diff --git a/src/environment.h b/src/environment.h index 14a18421b..0cc3222f9 100644 --- a/src/environment.h +++ b/src/environment.h @@ -42,13 +42,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "threading/atomic.h" #include "network/networkprotocol.h" // for AccessDeniedCode -class ITextureSource; -class IGameDef; -class Map; -class GameScripting; -class Player; -class PointedThing; - class Environment { public: diff --git a/src/game.cpp b/src/game.cpp index cfa6234ff..1070cb1b2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -916,16 +916,14 @@ bool nodePlacementPrediction(Client &client, } static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, - IWritableTextureSource *tsrc, IrrlichtDevice *device, - JoystickController *joystick, - IFormSource *fs_src, TextDest *txt_dest, Client *client) + Client *client, IrrlichtDevice *device, JoystickController *joystick, + IFormSource *fs_src, TextDest *txt_dest) { if (*cur_formspec == 0) { *cur_formspec = new GUIFormSpecMenu(device, joystick, - guiroot, -1, &g_menumgr, invmgr, gamedef, tsrc, - fs_src, txt_dest, client); + guiroot, -1, &g_menumgr, client, client->getTextureSource(), + fs_src, txt_dest); (*cur_formspec)->doPause = false; /* @@ -950,9 +948,9 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec, #endif static void show_deathscreen(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, + Client *client, IWritableTextureSource *tsrc, IrrlichtDevice *device, - JoystickController *joystick, Client *client) + JoystickController *joystick) { std::string formspec = std::string(FORMSPEC_VERSION_STRING) + @@ -968,13 +966,12 @@ static void show_deathscreen(GUIFormSpecMenu **cur_formspec, FormspecFormSource *fs_src = new FormspecFormSource(formspec); LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client); - create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, - joystick, fs_src, txt_dst, NULL); + create_formspec_menu(cur_formspec, client, device, joystick, fs_src, txt_dst); } /******************************************************************************/ static void show_pause_menu(GUIFormSpecMenu **cur_formspec, - InventoryManager *invmgr, IGameDef *gamedef, + Client *client, IWritableTextureSource *tsrc, IrrlichtDevice *device, JoystickController *joystick, bool singleplayermode) { @@ -1041,8 +1038,7 @@ static void show_pause_menu(GUIFormSpecMenu **cur_formspec, FormspecFormSource *fs_src = new FormspecFormSource(os.str()); LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU"); - create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, - joystick, fs_src, txt_dst, NULL); + create_formspec_menu(cur_formspec, client, device, joystick, fs_src, txt_dst); std::string con("btn_continue"); (*cur_formspec)->setFocus(con); (*cur_formspec)->doPause = true; @@ -1534,7 +1530,6 @@ private: bool *kill; std::string *error_message; bool *reconnect_requested; - IGameDef *gamedef; // Convenience (same as *client) scene::ISceneNode *skybox; bool random_input; @@ -2011,7 +2006,7 @@ bool Game::createClient(const std::string &playername, /* Camera */ - camera = new Camera(smgr, *draw_control, gamedef); + camera = new Camera(smgr, *draw_control, client); if (!camera || !camera->successfullyCreated(*error_message)) return false; client->setCamera(camera); @@ -2068,7 +2063,7 @@ bool Game::createClient(const std::string &playername, player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; - hud = new Hud(driver, smgr, guienv, gamedef, player, local_inventory); + hud = new Hud(driver, smgr, guienv, client, player, local_inventory); if (!hud) { *error_message = "Memory error: could not create HUD"; @@ -2198,8 +2193,6 @@ bool Game::connectToServer(const std::string &playername, if (!client) return false; - gamedef = client; // Client acts as our GameDef - infostream << "Connecting to server at "; connect_address.print(&infostream); infostream << std::endl; @@ -2445,7 +2438,7 @@ inline bool Game::handleCallbacks() void Game::processQueues() { texture_src->processQueue(); - itemdef_manager->processQueue(gamedef); + itemdef_manager->processQueue(client); shader_src->processQueue(); } @@ -2617,7 +2610,7 @@ void Game::processKeyInput(VolatileRunFlags *flags, openInventory(); } else if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) { if (!gui_chat_console->isOpenInhibited()) { - show_pause_menu(¤t_formspec, client, gamedef, + show_pause_menu(¤t_formspec, client, texture_src, device, &input->joystick, simple_singleplayer_mode); } @@ -2769,8 +2762,7 @@ void Game::openInventory() PlayerInventoryFormSource *fs_src = new PlayerInventoryFormSource(client); TextDest *txt_dst = new TextDestPlayerInventory(client); - create_formspec_menu(¤t_formspec, client, gamedef, texture_src, - device, &input->joystick, fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, fs_src, txt_dst); cur_formname = ""; InventoryLocation inventoryloc; @@ -3245,13 +3237,13 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) rangelim(event.player_damage.amount / 4, 1.0, 4.0); MtEvent *e = new SimpleTriggerEvent("PlayerDamage"); - gamedef->event()->put(e); + client->event()->put(e); } else if (event.type == CE_PLAYER_FORCE_MOVE) { cam->camera_yaw = event.player_force_move.yaw; cam->camera_pitch = event.player_force_move.pitch; } else if (event.type == CE_DEATHSCREEN) { - show_deathscreen(¤t_formspec, client, gamedef, texture_src, - device, &input->joystick, client); + show_deathscreen(¤t_formspec, client, texture_src, + device, &input->joystick); chat_backend->addMessage(L"", L"You died."); @@ -3271,9 +3263,8 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) TextDestPlayerInventory *txt_dst = new TextDestPlayerInventory(client, *(event.show_formspec.formname)); - create_formspec_menu(¤t_formspec, client, gamedef, - texture_src, device, &input->joystick, - fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, device, &input->joystick, + fs_src, txt_dst); cur_formname = *(event.show_formspec.formname); } @@ -3282,7 +3273,7 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash) } else if ((event.type == CE_SPAWN_PARTICLE) || (event.type == CE_ADD_PARTICLESPAWNER) || (event.type == CE_DELETE_PARTICLESPAWNER)) { - client->getParticleManager()->handleParticleEvent(&event, gamedef, + client->getParticleManager()->handleParticleEvent(&event, client, smgr, player); } else if (event.type == CE_HUDADD) { u32 id = event.hudadd.id; @@ -3840,8 +3831,8 @@ void Game::handlePointingAtNode(GameRunData *runData, &client->getEnv().getClientMap(), nodepos); TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client); - create_formspec_menu(¤t_formspec, client, gamedef, - texture_src, device, &input->joystick, fs_src, txt_dst, client); + create_formspec_menu(¤t_formspec, client, + device, &input->joystick, fs_src, txt_dst); cur_formname = ""; current_formspec->setFormSpec(meta->getString("formspec"), inventoryloc); @@ -3972,7 +3963,7 @@ void Game::handleDigging(GameRunData *runData, if (m_cache_enable_particles) { const ContentFeatures &features = client->getNodeDefManager()->get(n); - client->getParticleManager()->addPunchingParticles(gamedef, smgr, + client->getParticleManager()->addPunchingParticles(client, smgr, player, nodepos, features.tiles); } } @@ -4019,7 +4010,7 @@ void Game::handleDigging(GameRunData *runData, if (m_cache_enable_particles) { const ContentFeatures &features = client->getNodeDefManager()->get(wasnode); - client->getParticleManager()->addDiggingParticles(gamedef, smgr, + client->getParticleManager()->addDiggingParticles(client, smgr, player, nodepos, features.tiles); } @@ -4043,7 +4034,7 @@ void Game::handleDigging(GameRunData *runData, // Send event to trigger sound MtEvent *e = new NodeDugEvent(nodepos, wasnode); - gamedef->event()->put(e); + client->event()->put(e); } if (runData->dig_time_complete < 100000.0) { diff --git a/src/gamedef.h b/src/gamedef.h index 7e3da4cac..cb624bd6a 100644 --- a/src/gamedef.h +++ b/src/gamedef.h @@ -53,47 +53,22 @@ public: virtual INodeDefManager* getNodeDefManager()=0; virtual ICraftDefManager* getCraftDefManager()=0; - // This is always thread-safe, but referencing the irrlicht texture - // pointers in other threads than main thread will make things explode. - virtual ITextureSource* getTextureSource()=0; - - virtual IShaderSource* getShaderSource()=0; - // Used for keeping track of names/ids of unknown nodes virtual u16 allocateUnknownNodeId(const std::string &name)=0; - // Only usable on the client - virtual ISoundManager* getSoundManager()=0; virtual MtEventManager* getEventManager()=0; - virtual scene::IAnimatedMesh* getMesh(const std::string &filename) - { return NULL; } - virtual scene::ISceneManager* getSceneManager()=0; - - virtual Camera* getCamera() - { return NULL; } - virtual void setCamera(Camera *camera) {} // Only usable on the server, and NOT thread-safe. It is usable from the // environment thread. - virtual IRollbackManager* getRollbackManager(){return NULL;} - - // Only usable on the server. Thread safe if not written while running threads. - virtual EmergeManager *getEmergeManager() { return NULL; } - - // Used on the client - virtual bool checkLocalPrivilege(const std::string &priv) - { return false; } + virtual IRollbackManager* getRollbackManager() { return NULL; } // Shorthands IItemDefManager *idef() { return getItemDefManager(); } INodeDefManager *ndef() { return getNodeDefManager(); } ICraftDefManager *cdef() { return getCraftDefManager(); } - ITextureSource *tsrc() { return getTextureSource(); } - ISoundManager *sound() { return getSoundManager(); } - IShaderSource *shsrc() { return getShaderSource(); } + MtEventManager *event() { return getEventManager(); } IRollbackManager *rollback() { return getRollbackManager();} - EmergeManager *emerge() { return getEmergeManager(); } }; #endif diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index a3c35f68d..6d66ed08d 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -194,11 +194,9 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, -1, m_menumanager, NULL /* &client */, - NULL /* gamedef */, m_texture_source, m_formspecgui, m_buttonhandler, - NULL, false); m_menu->allowClose(false); diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index bfc7a9b79..45b0e9c11 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -81,13 +81,12 @@ static unsigned int font_line_height(gui::IGUIFont *font) GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev, JoystickController *joystick, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, - InventoryManager *invmgr, IGameDef *gamedef, + Client *client, ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst, - Client* client, bool remap_dbl_click) : + bool remap_dbl_click) : GUIModalMenu(dev->getGUIEnvironment(), parent, id, menumgr), m_device(dev), - m_invmgr(invmgr), - m_gamedef(gamedef), + m_invmgr(client), m_tsrc(tsrc), m_client(client), m_selected_item(NULL), @@ -307,8 +306,8 @@ void GUIFormSpecMenu::parseContainerEnd(parserData* data) void GUIFormSpecMenu::parseList(parserData* data,std::string element) { - if (m_gamedef == 0) { - warningstream<<"invalid use of 'list' with m_gamedef==0"<explicit_size) warningstream<<"invalid use of item_image_button without a size[] element"<idef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(item_name, idef); @@ -2297,14 +2296,14 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, if(!item.empty()) { drawItemStack(driver, m_font, item, - rect, &AbsoluteClippingRect, m_gamedef, + rect, &AbsoluteClippingRect, m_client, rotation_kind); } // Draw tooltip std::wstring tooltip_text = L""; if (hovering && !m_selected_item) { - tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description); + tooltip_text = utf8_to_wide(item.getDefinition(m_client->idef()).description); } if (tooltip_text != L"") { std::vector tt_rows = str_split(tooltip_text, L'\n'); @@ -2349,7 +2348,7 @@ void GUIFormSpecMenu::drawSelectedItem() if (!m_selected_item) { drawItemStack(driver, m_font, ItemStack(), core::rect(v2s32(0, 0), v2s32(0, 0)), - NULL, m_gamedef, IT_ROT_DRAGGED); + NULL, m_client, IT_ROT_DRAGGED); return; } @@ -2363,7 +2362,7 @@ void GUIFormSpecMenu::drawSelectedItem() core::rect imgrect(0,0,imgsize.X,imgsize.Y); core::rect rect = imgrect + (m_pointer - imgrect.getCenter()); rect.constrainTo(driver->getViewPort()); - drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED); + drawItemStack(driver, m_font, stack, rect, NULL, m_client, IT_ROT_DRAGGED); } void GUIFormSpecMenu::drawMenu() @@ -2488,11 +2487,11 @@ void GUIFormSpecMenu::drawMenu() */ for(u32 i=0; iidef(); + IItemDefManager *idef = m_client->idef(); ItemStack item; item.deSerialize(spec.item_name, idef); core::rect imgrect(0, 0, spec.geom.X, spec.geom.Y); @@ -2509,7 +2508,7 @@ void GUIFormSpecMenu::drawMenu() #endif } drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect, - m_gamedef, IT_ROT_NONE); + m_client, IT_ROT_NONE); } /* @@ -2527,7 +2526,7 @@ void GUIFormSpecMenu::drawMenu() if (!item_hovered) { drawItemStack(driver, m_font, ItemStack(), core::rect(v2s32(0, 0), v2s32(0, 0)), - NULL, m_gamedef, IT_ROT_HOVERED); + NULL, m_client, IT_ROT_HOVERED); } /* TODO find way to show tooltips on touchscreen */ @@ -3470,7 +3469,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) // Check how many items can be moved move_amount = stack_from.count = MYMIN(move_amount, stack_from.count); - ItemStack leftover = stack_to.addItem(stack_from, m_gamedef->idef()); + ItemStack leftover = stack_to.addItem(stack_from, m_client->idef()); // If source stack cannot be added to destination stack at all, // they are swapped if ((leftover.count == stack_from.count) && diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 95df11e6a..94b52e6f0 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -34,7 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "util/enriched_string.h" -class IGameDef; class InventoryManager; class ISimpleTextureSource; class Client; @@ -289,12 +288,10 @@ public: JoystickController *joystick, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, - InventoryManager *invmgr, - IGameDef *gamedef, + Client *client, ISimpleTextureSource *tsrc, IFormSource* fs_src, TextDest* txt_dst, - Client* client, bool remap_dbl_click = true); ~GUIFormSpecMenu(); @@ -384,7 +381,6 @@ protected: irr::IrrlichtDevice* m_device; InventoryManager *m_invmgr; - IGameDef *m_gamedef; ISimpleTextureSource *m_tsrc; Client *m_client; diff --git a/src/hud.cpp b/src/hud.cpp index 43d957380..a602125e3 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -22,10 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hud.h" #include "settings.h" #include "util/numeric.h" -#include "util/string.h" #include "log.h" -#include "gamedef.h" -#include "itemdef.h" +#include "client.h" #include "inventory.h" #include "client/tile.h" #include "localplayer.h" @@ -41,13 +39,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #endif Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, - gui::IGUIEnvironment* guienv, IGameDef *gamedef, LocalPlayer *player, + gui::IGUIEnvironment* guienv, Client *client, LocalPlayer *player, Inventory *inventory) { this->driver = driver; this->smgr = smgr; this->guienv = guienv; - this->gamedef = gamedef; + this->client = client; this->player = player; this->inventory = inventory; @@ -61,7 +59,7 @@ Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, for (unsigned int i = 0; i < 4; i++) hbar_colors[i] = video::SColor(255, 255, 255, 255); - tsrc = gamedef->getTextureSource(); + tsrc = client->getTextureSource(); v3f crosshair_color = g_settings->getV3F("crosshair_color"); u32 cross_r = rangelim(myround(crosshair_color.X), 0, 255); @@ -92,7 +90,7 @@ Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr, m_selection_material.Lighting = false; if (g_settings->getBool("enable_shaders")) { - IShaderSource *shdrsrc = gamedef->getShaderSource(); + IShaderSource *shdrsrc = client->getShaderSource(); u16 shader_id = shdrsrc->getShader( mode == "halo" ? "selection_shader" : "default_shader", 1, 1); m_selection_material.MaterialType = shdrsrc->getShaderInfo(shader_id).material; @@ -193,7 +191,7 @@ void Hud::drawItem(const ItemStack &item, const core::rect& rect, if (!use_hotbar_image) driver->draw2DRectangle(bgcolor2, rect, NULL); drawItemStack(driver, g_fontengine->getFont(), item, rect, NULL, - gamedef, selected ? IT_ROT_SELECTED : IT_ROT_NONE); + client, selected ? IT_ROT_SELECTED : IT_ROT_NONE); } //NOTE: selectitem = 0 -> no selected; selectitem 1-based @@ -629,7 +627,7 @@ void drawItemStack(video::IVideoDriver *driver, const ItemStack &item, const core::rect &rect, const core::rect *clip, - IGameDef *gamedef, + Client *client, ItemRotationKind rotation_kind) { static MeshTimeInfo rotation_time_infos[IT_ROT_NONE]; @@ -643,8 +641,8 @@ void drawItemStack(video::IVideoDriver *driver, return; } - const ItemDefinition &def = item.getDefinition(gamedef->idef()); - scene::IMesh* mesh = gamedef->idef()->getWieldMesh(def.name, gamedef); + const ItemDefinition &def = item.getDefinition(client->idef()); + scene::IMesh* mesh = client->idef()->getWieldMesh(def.name, client); if (mesh) { driver->clearZBuffer(); diff --git a/src/hud.h b/src/hud.h index a4d7990e9..efa0c3648 100644 --- a/src/hud.h +++ b/src/hud.h @@ -95,7 +95,7 @@ struct HudElement { #include #include "irr_aabb3d.h" -class IGameDef; +class Client; class ITextureSource; class Inventory; class InventoryList; @@ -107,7 +107,7 @@ public: video::IVideoDriver *driver; scene::ISceneManager* smgr; gui::IGUIEnvironment *guienv; - IGameDef *gamedef; + Client *client; LocalPlayer *player; Inventory *inventory; ITextureSource *tsrc; @@ -121,7 +121,7 @@ public: bool use_hotbar_selected_image; Hud(video::IVideoDriver *driver,scene::ISceneManager* smgr, - gui::IGUIEnvironment* guienv, IGameDef *gamedef, LocalPlayer *player, + gui::IGUIEnvironment* guienv, Client *client, LocalPlayer *player, Inventory *inventory); ~Hud(); @@ -190,7 +190,7 @@ void drawItemStack(video::IVideoDriver *driver, const ItemStack &item, const core::rect &rect, const core::rect *clip, - IGameDef *gamedef, + Client *client, ItemRotationKind rotation_kind); #endif diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 1aa6331dc..5ba9d8f9a 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemdef.h" -#include "gamedef.h" #include "nodedef.h" #include "tool.h" #include "inventory.h" @@ -29,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh.h" #include "wieldmesh.h" #include "client/tile.h" +#include "client.h" #endif #include "log.h" #include "settings.h" @@ -317,7 +317,7 @@ public: #ifndef SERVER public: ClientCached* createClientCachedDirect(const std::string &name, - IGameDef *gamedef) const + Client *client) const { infostream<<"Lazily creating item texture and mesh for \"" <getTextureSource(); + ITextureSource *tsrc = client->getTextureSource(); const ItemDefinition &def = get(name); // Create new ClientCached @@ -345,7 +345,7 @@ public: ItemStack item = ItemStack(); item.name = def.name; - scene::IMesh *mesh = getItemMesh(gamedef, item); + scene::IMesh *mesh = getItemMesh(client, item); cc->wield_mesh = mesh; // Put in cache @@ -354,7 +354,7 @@ public: return cc; } ClientCached* getClientCached(const std::string &name, - IGameDef *gamedef) const + Client *client) const { ClientCached *cc = NULL; m_clientcached.get(name, &cc); @@ -363,7 +363,7 @@ public: if(thr_is_current_thread(m_main_thread)) { - return createClientCachedDirect(name, gamedef); + return createClientCachedDirect(name, client); } else { @@ -392,18 +392,18 @@ public: } // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const + Client *client) const { - ClientCached *cc = getClientCached(name, gamedef); + ClientCached *cc = getClientCached(name, client); if(!cc) return NULL; return cc->inventory_texture; } // Get item wield mesh virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const + Client *client) const { - ClientCached *cc = getClientCached(name, gamedef); + ClientCached *cc = getClientCached(name, client); if(!cc) return NULL; return cc->wield_mesh; @@ -543,7 +543,7 @@ public: request = m_get_clientcached_queue.pop(); m_get_clientcached_queue.pushResult(request, - createClientCachedDirect(request.key, gamedef)); + createClientCachedDirect(request.key, (Client *)gamedef)); } #endif } diff --git a/src/itemdef.h b/src/itemdef.h index dcb98e8a9..2ade6116a 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemgroup.h" #include "sound.h" class IGameDef; +class Client; struct ToolCapabilities; /* @@ -107,10 +108,10 @@ public: #ifndef SERVER // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; // Get item wield mesh virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; #endif virtual void serialize(std::ostream &os, u16 protocol_version)=0; @@ -133,10 +134,10 @@ public: #ifndef SERVER // Get item inventory texture virtual video::ITexture* getInventoryTexture(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; // Get item wield mesh virtual scene::IMesh* getWieldMesh(const std::string &name, - IGameDef *gamedef) const=0; + Client *client) const=0; #endif // Remove all registered item and node definitions and aliases diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 4d0ca0600..b859c6455 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "event.h" #include "collision.h" -#include "gamedef.h" #include "nodedef.h" #include "settings.h" #include "environment.h" @@ -32,8 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc., LocalPlayer */ -LocalPlayer::LocalPlayer(Client *gamedef, const char *name): - Player(name, gamedef->idef()), +LocalPlayer::LocalPlayer(Client *client, const char *name): + Player(name, client->idef()), parent(0), hp(PLAYER_MAX_HP), got_teleported(false), @@ -79,7 +78,7 @@ LocalPlayer::LocalPlayer(Client *gamedef, const char *name): camera_barely_in_ceiling(false), m_collisionbox(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30), m_cao(NULL), - m_gamedef(gamedef) + m_client(client) { // Initialize hp to 0, so that no hearts will be shown if server // doesn't support health points @@ -96,7 +95,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, std::vector *collision_info) { Map *map = &env->getMap(); - INodeDefManager *nodemgr = m_gamedef->ndef(); + INodeDefManager *nodemgr = m_client->ndef(); v3f position = getPosition(); @@ -109,8 +108,8 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, } // Skip collision detection if noclip mode is used - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool noclip = m_gamedef->checkLocalPrivilege("noclip") && + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool noclip = m_client->checkLocalPrivilege("noclip") && g_settings->getBool("noclip"); bool free_move = noclip && fly_allowed && g_settings->getBool("free_move"); if (free_move) { @@ -241,7 +240,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, v3f accel_f = v3f(0,0,0); - collisionMoveResult result = collisionMoveSimple(env, m_gamedef, + collisionMoveResult result = collisionMoveSimple(env, m_client, pos_max_d, m_collisionbox, player_stepheight, dtime, &position, &m_speed, accel_f); @@ -376,7 +375,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, if(!result.standing_on_object && !touching_ground_was && touching_ground) { MtEvent *e = new SimpleTriggerEvent("PlayerRegainGround"); - m_gamedef->event()->put(e); + m_client->event()->put(e); // Set camera impact value to be used for view bobbing camera_impact = getSpeed().Y * -1; @@ -448,8 +447,8 @@ void LocalPlayer::applyControl(float dtime) v3f speedH = v3f(0,0,0); // Horizontal (X, Z) v3f speedV = v3f(0,0,0); // Vertical (Y) - bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); - bool fast_allowed = m_gamedef->checkLocalPrivilege("fast"); + bool fly_allowed = m_client->checkLocalPrivilege("fly"); + bool fast_allowed = m_client->checkLocalPrivilege("fast"); bool free_move = fly_allowed && g_settings->getBool("free_move"); bool fast_move = fast_allowed && g_settings->getBool("fast_move"); @@ -599,7 +598,7 @@ void LocalPlayer::applyControl(float dtime) setSpeed(speedJ); MtEvent *e = new SimpleTriggerEvent("PlayerJump"); - m_gamedef->event()->put(e); + m_client->event()->put(e); } } else if(in_liquid) diff --git a/src/localplayer.h b/src/localplayer.h index 7a1cb7466..cbdcb9867 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -35,7 +35,7 @@ enum LocalPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM}; // no local class LocalPlayer : public Player { public: - LocalPlayer(Client *gamedef, const char *name); + LocalPlayer(Client *client, const char *name); virtual ~LocalPlayer(); ClientActiveObject *parent; @@ -162,7 +162,7 @@ private: aabb3f m_collisionbox; GenericCAO* m_cao; - Client *m_gamedef; + Client *m_client; }; #endif diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 977eabb6e..143adb410 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "profiler.h" #include "nodedef.h" -#include "gamedef.h" #include "mesh.h" #include "minimap.h" #include "content_mapblock.h" @@ -43,14 +42,14 @@ static void applyFacesShading(video::SColor &color, const float factor) MeshMakeData */ -MeshMakeData::MeshMakeData(IGameDef *gamedef, bool use_shaders, +MeshMakeData::MeshMakeData(Client *client, bool use_shaders, bool use_tangent_vertices): m_vmanip(), m_blockpos(-1337,-1337,-1337), m_crack_pos_relative(-1337, -1337, -1337), m_smooth_lighting(false), m_show_hud(false), - m_gamedef(gamedef), + m_client(client), m_use_shaders(use_shaders), m_use_tangent_vertices(use_tangent_vertices) {} @@ -233,7 +232,7 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data) v3s16(1,1,1), }; - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); u16 ambient_occlusion = 0; u16 light_count = 0; @@ -664,7 +663,7 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, */ TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data) { - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); TileSpec spec = ndef->get(mn).tiles[tileindex]; // Apply temporary crack if (p == data->m_crack_pos_relative) @@ -677,7 +676,7 @@ TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data) */ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) { - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); // Direction must be (1,0,0), (-1,0,0), (0,1,0), (0,-1,0), // (0,0,1), (0,0,-1) or (0,0,0) @@ -734,7 +733,7 @@ TileSpec getNodeTile(MapNode mn, v3s16 p, v3s16 dir, MeshMakeData *data) u16 tile_index=facedir*16 + dir_i; TileSpec spec = getNodeTileN(mn, p, dir_to_tile[tile_index], data); spec.rotation=dir_to_tile[tile_index + 1]; - spec.texture = data->m_gamedef->tsrc()->getTexture(spec.texture_id); + spec.texture = data->m_client->tsrc()->getTexture(spec.texture_id); return spec; } @@ -753,7 +752,7 @@ static void getTileInfo( ) { VoxelManipulator &vmanip = data->m_vmanip; - INodeDefManager *ndef = data->m_gamedef->ndef(); + INodeDefManager *ndef = data->m_client->ndef(); v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; MapNode &n0 = vmanip.getNodeRefUnsafe(blockpos_nodes + p); @@ -1020,10 +1019,10 @@ static void updateAllFastFaceRows(MeshMakeData *data, MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): m_mesh(new scene::SMesh()), m_minimap_mapblock(NULL), - m_gamedef(data->m_gamedef), - m_driver(m_gamedef->tsrc()->getDevice()->getVideoDriver()), - m_tsrc(m_gamedef->getTextureSource()), - m_shdrsrc(m_gamedef->getShaderSource()), + m_client(data->m_client), + m_driver(m_client->tsrc()->getDevice()->getVideoDriver()), + m_tsrc(m_client->getTextureSource()), + m_shdrsrc(m_client->getShaderSource()), m_animation_force_timer(0), // force initial animation m_last_crack(-1), m_crack_materials(), @@ -1243,7 +1242,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): if (m_use_tangent_vertices) { scene::IMeshManipulator* meshmanip = - m_gamedef->getSceneManager()->getMeshManipulator(); + m_client->getSceneManager()->getMeshManipulator(); meshmanip->recalculateTangents(m_mesh, true, false, false); } diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 8376468da..5adb7df3f 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/cpp11_container.h" #include -class IGameDef; +class Client; class IShaderSource; /* @@ -45,11 +45,11 @@ struct MeshMakeData bool m_smooth_lighting; bool m_show_hud; - IGameDef *m_gamedef; + Client *m_client; bool m_use_shaders; bool m_use_tangent_vertices; - MeshMakeData(IGameDef *gamedef, bool use_shaders, + MeshMakeData(Client *client, bool use_shaders, bool use_tangent_vertices = false); /* @@ -128,7 +128,7 @@ public: private: scene::IMesh *m_mesh; MinimapMapblock *m_minimap_mapblock; - IGameDef *m_gamedef; + Client *m_client; video::IVideoDriver *m_driver; ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp index 78034bf6c..d564e9415 100644 --- a/src/mg_biome.cpp +++ b/src/mg_biome.cpp @@ -20,10 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mg_biome.h" #include "mg_decoration.h" #include "emerge.h" -#include "gamedef.h" +#include "server.h" #include "nodedef.h" #include "map.h" //for MMVManip -#include "log.h" #include "util/numeric.h" #include "util/mathconstants.h" #include "porting.h" @@ -33,10 +32,10 @@ with this program; if not, write to the Free Software Foundation, Inc., /////////////////////////////////////////////////////////////////////////////// -BiomeManager::BiomeManager(IGameDef *gamedef) : - ObjDefManager(gamedef, OBJDEF_BIOME) +BiomeManager::BiomeManager(Server *server) : + ObjDefManager(server, OBJDEF_BIOME) { - m_gamedef = gamedef; + m_server = server; // Create default biome to be used in case none exist Biome *b = new Biome; @@ -73,7 +72,7 @@ BiomeManager::~BiomeManager() void BiomeManager::clear() { - EmergeManager *emerge = m_gamedef->getEmergeManager(); + EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; diff --git a/src/mg_biome.h b/src/mg_biome.h index a10193bc3..15088f7dd 100644 --- a/src/mg_biome.h +++ b/src/mg_biome.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "noise.h" +class Server; class Settings; class BiomeManager; @@ -186,7 +187,7 @@ private: class BiomeManager : public ObjDefManager { public: - BiomeManager(IGameDef *gamedef); + BiomeManager(Server *server); virtual ~BiomeManager(); const char *getObjectTitle() const @@ -223,7 +224,7 @@ public: virtual void clear(); private: - IGameDef *m_gamedef; + Server *m_server; }; diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index e028215dc..3d08d86fa 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include "mg_schematic.h" -#include "gamedef.h" +#include "server.h" #include "mapgen.h" #include "emerge.h" #include "map.h" @@ -34,16 +34,16 @@ with this program; if not, write to the Free Software Foundation, Inc., /////////////////////////////////////////////////////////////////////////////// -SchematicManager::SchematicManager(IGameDef *gamedef) : - ObjDefManager(gamedef, OBJDEF_SCHEMATIC) +SchematicManager::SchematicManager(Server *server) : + ObjDefManager(server, OBJDEF_SCHEMATIC) { - m_gamedef = gamedef; + m_server = server; } void SchematicManager::clear() { - EmergeManager *emerge = m_gamedef->getEmergeManager(); + EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations DecorationManager *decomgr = emerge->decomgr; diff --git a/src/mg_schematic.h b/src/mg_schematic.h index da8859540..1d46e6ac4 100644 --- a/src/mg_schematic.h +++ b/src/mg_schematic.h @@ -29,7 +29,7 @@ class Mapgen; class MMVManip; class PseudoRandom; class NodeResolver; -class IGameDef; +class Server; /* Minetest Schematic File Format @@ -123,7 +123,7 @@ public: class SchematicManager : public ObjDefManager { public: - SchematicManager(IGameDef *gamedef); + SchematicManager(Server *server); virtual ~SchematicManager() {} virtual void clear(); @@ -139,7 +139,7 @@ public: } private: - IGameDef *m_gamedef; + Server *m_server; }; void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount, diff --git a/src/nodedef.cpp b/src/nodedef.cpp index dbbdf95d2..b7d023897 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef SERVER #include "client/tile.h" #include "mesh.h" +#include "client.h" #include #endif #include "log.h" @@ -572,8 +573,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, #ifndef SERVER void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, - scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip, - IGameDef *gamedef, const TextureSettings &tsettings) + scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings) { // minimap pixel color - the average color of a texture if (tsettings.enable_minimap && tiledef[0].name != "") @@ -709,7 +709,7 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc if ((drawtype == NDT_MESH) && (mesh != "")) { // Meshnode drawtype // Read the mesh and apply scale - mesh_ptr[0] = gamedef->getMesh(mesh); + mesh_ptr[0] = client->getMesh(mesh); if (mesh_ptr[0]){ v3f scale = v3f(1.0, 1.0, 1.0) * BS * visual_scale; scaleMesh(mesh_ptr[0], scale); @@ -1316,9 +1316,11 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef, #ifndef SERVER infostream << "CNodeDefManager::updateTextures(): Updating " "textures in node definitions" << std::endl; - ITextureSource *tsrc = gamedef->tsrc(); - IShaderSource *shdsrc = gamedef->getShaderSource(); - scene::ISceneManager* smgr = gamedef->getSceneManager(); + + Client *client = (Client *)gamedef; + ITextureSource *tsrc = client->tsrc(); + IShaderSource *shdsrc = client->getShaderSource(); + scene::ISceneManager* smgr = client->getSceneManager(); scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator(); TextureSettings tsettings; tsettings.readSettings(); @@ -1326,7 +1328,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef, u32 size = m_content_features.size(); for (u32 i = 0; i < size; i++) { - m_content_features[i].updateTextures(tsrc, shdsrc, smgr, meshmanip, gamedef, tsettings); + m_content_features[i].updateTextures(tsrc, shdsrc, meshmanip, client, tsettings); progress_callback(progress_callback_args, i, size); } #endif diff --git a/src/nodedef.h b/src/nodedef.h index 284c4a198..183b95d87 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef SERVER #include "client/tile.h" #include "shader.h" +class Client; #endif #include "itemgroup.h" #include "sound.h" // SimpleSoundSpec @@ -322,8 +323,7 @@ struct ContentFeatures u32 shader_id, bool use_normal_texture, bool backface_culling, u8 alpha, u8 material_type); void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, - scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip, - IGameDef *gamedef, const TextureSettings &tsettings); + scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings); #endif }; diff --git a/src/particles.cpp b/src/particles.cpp index 97f42e2c4..d9eb3cfa5 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -18,11 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "particles.h" -#include "constants.h" -#include "debug.h" -#include "settings.h" -#include "client/tile.h" -#include "gamedef.h" +#include "client.h" #include "collision.h" #include #include "util/numeric.h" @@ -452,7 +448,7 @@ void ParticleManager::clearAll () } } -void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, +void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, scene::ISceneManager* smgr, LocalPlayer *player) { switch (event->type) { @@ -477,9 +473,9 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, } video::ITexture *texture = - gamedef->tsrc()->getTextureForMesh(*(event->add_particlespawner.texture)); + client->tsrc()->getTextureForMesh(*(event->add_particlespawner.texture)); - ParticleSpawner* toadd = new ParticleSpawner(gamedef, smgr, player, + ParticleSpawner* toadd = new ParticleSpawner(client, smgr, player, event->add_particlespawner.amount, event->add_particlespawner.spawntime, *event->add_particlespawner.minpos, @@ -520,9 +516,9 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef, } case CE_SPAWN_PARTICLE: { video::ITexture *texture = - gamedef->tsrc()->getTextureForMesh(*(event->spawn_particle.texture)); + client->tsrc()->getTextureForMesh(*(event->spawn_particle.texture)); - Particle* toadd = new Particle(gamedef, smgr, player, m_env, + Particle* toadd = new Particle(client, smgr, player, m_env, *event->spawn_particle.pos, *event->spawn_particle.vel, *event->spawn_particle.acc, diff --git a/src/particles.h b/src/particles.h index eb8c6665d..00cb2c08e 100644 --- a/src/particles.h +++ b/src/particles.h @@ -170,7 +170,7 @@ public: void step (float dtime); - void handleParticleEvent(ClientEvent *event,IGameDef *gamedef, + void handleParticleEvent(ClientEvent *event, Client *client, scene::ISceneManager* smgr, LocalPlayer *player); void addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 84aa9252c..b240ec21f 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -24,12 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "pathfinder.h" #include "serverenvironment.h" -#include "gamedef.h" +#include "server.h" #include "nodedef.h" -#include "map.h" -#include "log.h" -#include "irr_aabb3d.h" -#include "util/basic_macros.h" //#define PATHFINDER_DEBUG //#define PATHFINDER_CALC_TIME diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 3cdd3cbfe..3d03c0c41 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -20,14 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_nodemeta.h" #include "lua_api/l_internal.h" #include "lua_api/l_inventory.h" -#include "common/c_converter.h" #include "common/c_content.h" #include "serverenvironment.h" #include "map.h" -#include "gamedef.h" -#include "nodemetadata.h" - - +#include "server.h" /* NodeMetaRef diff --git a/src/server.cpp b/src/server.cpp index 60dbef0d2..7380d37c2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -50,7 +50,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_abm.h" #include "content_sao.h" #include "mods.h" -#include "sound.h" // dummySoundManager #include "event_manager.h" #include "serverlist.h" #include "util/string.h" @@ -3310,29 +3309,12 @@ ICraftDefManager *Server::getCraftDefManager() { return m_craftdef; } -ITextureSource *Server::getTextureSource() -{ - return NULL; -} -IShaderSource *Server::getShaderSource() -{ - return NULL; -} -scene::ISceneManager *Server::getSceneManager() -{ - return NULL; -} u16 Server::allocateUnknownNodeId(const std::string &name) { return m_nodedef->allocateDummy(name); } -ISoundManager *Server::getSoundManager() -{ - return &dummySoundManager; -} - MtEventManager *Server::getEventManager() { return m_event; diff --git a/src/server.h b/src/server.h index fe7b50b77..a86f75f1d 100644 --- a/src/server.h +++ b/src/server.h @@ -283,13 +283,9 @@ public: virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); - virtual IShaderSource* getShaderSource(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); - virtual scene::ISceneManager* getSceneManager(); - virtual IRollbackManager *getRollbackManager() { return m_rollback; } + IRollbackManager *getRollbackManager() { return m_rollback; } virtual EmergeManager *getEmergeManager() { return m_emerge; } IWritableItemDefManager* getWritableItemDefManager(); diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index c9fa64ec5..e1962bcff 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -352,11 +352,11 @@ void ActiveBlockList::update(std::vector &active_positions, */ ServerEnvironment::ServerEnvironment(ServerMap *map, - GameScripting *scriptIface, IGameDef *gamedef, + GameScripting *scriptIface, Server *server, const std::string &path_world) : m_map(map), m_script(scriptIface), - m_gamedef(gamedef), + m_server(server), m_path_world(path_world), m_send_recommended_timer(0), m_active_block_interval_overload_skip(0), @@ -487,7 +487,7 @@ void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, for (std::vector::iterator it = m_players.begin(); it != m_players.end(); ++it) { RemotePlayer *player = dynamic_cast(*it); - ((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id, + m_server->DenyAccessVerCompliant(player->peer_id, player->protocol_version, reason, str_reason, reconnect); } } @@ -501,7 +501,7 @@ void ServerEnvironment::saveLoadedPlayers() it != m_players.end(); ++it) { if ((*it)->checkModified()) { - (*it)->save(players_path, m_gamedef); + (*it)->save(players_path, m_server); } } } @@ -511,7 +511,7 @@ void ServerEnvironment::savePlayer(RemotePlayer *player) std::string players_path = m_path_world + DIR_DELIM "players"; fs::CreateDir(players_path); - player->save(players_path, m_gamedef); + player->save(players_path, m_server); } RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao) @@ -523,7 +523,7 @@ RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, Playe RemotePlayer *player = getPlayer(playername.c_str()); if (!player) { - player = new RemotePlayer("", m_gamedef->idef()); + player = new RemotePlayer("", m_server->idef()); newplayer = true; } @@ -632,7 +632,7 @@ void ServerEnvironment::loadMeta() } catch (SettingNotFoundException &e) { // No problem, this is expected. Just continue with an empty string } - m_lbm_mgr.loadIntroductionTimes(lbm_introduction_times, m_gamedef, m_game_time); + m_lbm_mgr.loadIntroductionTimes(lbm_introduction_times, m_server, m_game_time); m_day_count = args.exists("day_count") ? args.getU64("day_count") : 0; @@ -640,7 +640,7 @@ void ServerEnvironment::loadMeta() void ServerEnvironment::loadDefaultMeta() { - m_lbm_mgr.loadIntroductionTimes("", m_gamedef, m_game_time); + m_lbm_mgr.loadIntroductionTimes("", m_server, m_game_time); } struct ActiveABM @@ -902,7 +902,7 @@ void ServerEnvironment::addLoadingBlockModifierDef(LoadingBlockModifierDef *lbm) bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) { - INodeDefManager *ndef = m_gamedef->ndef(); + INodeDefManager *ndef = m_server->ndef(); MapNode n_old = m_map->getNodeNoEx(p); // Call destructor @@ -929,7 +929,7 @@ bool ServerEnvironment::setNode(v3s16 p, const MapNode &n) bool ServerEnvironment::removeNode(v3s16 p) { - INodeDefManager *ndef = m_gamedef->ndef(); + INodeDefManager *ndef = m_server->ndef(); MapNode n_old = m_map->getNodeNoEx(p); // Call destructor diff --git a/src/serverenvironment.h b/src/serverenvironment.h index 20a783ea5..d71d29a9c 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -29,6 +29,8 @@ class PlayerSAO; class ServerEnvironment; class ActiveBlockModifier; class ServerActiveObject; +class Server; +class GameScripting; /* {Active, Loading} block modifier interface. @@ -190,7 +192,7 @@ class ServerEnvironment : public Environment { public: ServerEnvironment(ServerMap *map, GameScripting *scriptIface, - IGameDef *gamedef, const std::string &path_world); + Server *server, const std::string &path_world); ~ServerEnvironment(); Map & getMap(); @@ -201,8 +203,8 @@ public: GameScripting* getScriptIface() { return m_script; } - IGameDef *getGameDef() - { return m_gamedef; } + Server *getGameDef() + { return m_server; } float getSendRecommendedInterval() { return m_recommended_send_interval; } @@ -377,8 +379,8 @@ private: ServerMap *m_map; // Lua state GameScripting* m_script; - // Game definition - IGameDef *m_gamedef; + // Server definition + Server *m_server; // World path const std::string m_path_world; // Active object list diff --git a/src/wieldmesh.cpp b/src/wieldmesh.cpp index 9c4d5b642..c305238fe 100644 --- a/src/wieldmesh.cpp +++ b/src/wieldmesh.cpp @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "wieldmesh.h" #include "inventory.h" -#include "gamedef.h" +#include "client.h" #include "itemdef.h" #include "nodedef.h" #include "mesh.h" @@ -283,7 +283,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, video::SMaterial &material = m_meshnode->getMaterial(0); material.setTexture(0, tsrc->getTextureForMesh(imagename)); material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; - material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; + material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; material.MaterialType = m_material_type; material.setFlag(video::EMF_BACK_FACE_CULLING, true); // Enable bi/trilinear filtering only for high resolution textures @@ -304,12 +304,12 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, } } -void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) +void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client) { - ITextureSource *tsrc = gamedef->getTextureSource(); - IItemDefManager *idef = gamedef->getItemDefManager(); - IShaderSource *shdrsrc = gamedef->getShaderSource(); - INodeDefManager *ndef = gamedef->getNodeDefManager(); + ITextureSource *tsrc = client->getTextureSource(); + IItemDefManager *idef = client->getItemDefManager(); + IShaderSource *shdrsrc = client->getShaderSource(); + INodeDefManager *ndef = client->getNodeDefManager(); const ItemDefinition &def = item.getDefinition(idef); const ContentFeatures &f = ndef->get(def.name); content_t id = ndef->getId(def.name); @@ -341,7 +341,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, IGameDef *gamedef) } else if (f.drawtype == NDT_NORMAL || f.drawtype == NDT_ALLFACES) { setCube(f.tiles, def.wield_scale, tsrc); } else { - MeshMakeData mesh_make_data(gamedef, false); + MeshMakeData mesh_make_data(client, false); MapNode mesh_make_node(id, 255, 0); mesh_make_data.fillSingleNode(&mesh_make_node); MapBlockMesh mapblock_mesh(&mesh_make_data, v3s16(0, 0, 0)); @@ -435,11 +435,11 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) m_meshnode->setVisible(true); } -scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item) +scene::IMesh *getItemMesh(Client *client, const ItemStack &item) { - ITextureSource *tsrc = gamedef->getTextureSource(); - IItemDefManager *idef = gamedef->getItemDefManager(); - INodeDefManager *ndef = gamedef->getNodeDefManager(); + ITextureSource *tsrc = client->getTextureSource(); + IItemDefManager *idef = client->getItemDefManager(); + INodeDefManager *ndef = client->getNodeDefManager(); const ItemDefinition &def = item.getDefinition(idef); const ContentFeatures &f = ndef->get(def.name); content_t id = ndef->getId(def.name); @@ -470,7 +470,7 @@ scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item) mesh = cloneMesh(g_extrusion_mesh_cache->createCube()); scaleMesh(mesh, v3f(1.2, 1.2, 1.2)); } else { - MeshMakeData mesh_make_data(gamedef, false); + MeshMakeData mesh_make_data(client, false); MapNode mesh_make_node(id, 255, 0); mesh_make_data.fillSingleNode(&mesh_make_node); MapBlockMesh mapblock_mesh(&mesh_make_data, v3s16(0, 0, 0)); diff --git a/src/wieldmesh.h b/src/wieldmesh.h index 0b3136bc1..0162c5e5a 100644 --- a/src/wieldmesh.h +++ b/src/wieldmesh.h @@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include struct ItemStack; -class IGameDef; +class Client; class ITextureSource; struct TileSpec; @@ -42,7 +42,7 @@ public: v3f wield_scale, ITextureSource *tsrc); void setExtruded(const std::string &imagename, v3f wield_scale, ITextureSource *tsrc, u8 num_frames); - void setItem(const ItemStack &item, IGameDef *gamedef); + void setItem(const ItemStack &item, Client *client); // Sets the vertex color of the wield mesh. // Must only be used if the constructor was called with lighting = false @@ -77,7 +77,7 @@ private: aabb3f m_bounding_box; }; -scene::IMesh *getItemMesh(IGameDef *gamedef, const ItemStack &item); +scene::IMesh *getItemMesh(Client *client, const ItemStack &item); scene::IMesh *getExtrudedMesh(ITextureSource *tsrc, const std::string &imagename); From ec30d49e026af2d0cb8329eb66aec48d12e79839 Mon Sep 17 00:00:00 2001 From: Rui Date: Tue, 10 Jan 2017 04:39:45 +0900 Subject: [PATCH 044/586] Add staticdata parameter to add_entity (#5009) * Add staticdata parameter to add_entity * Add add_entity_with_staticdata to core.features --- builtin/game/features.lua | 1 + doc/lua_api.txt | 2 +- src/script/lua_api/l_env.cpp | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/builtin/game/features.lua b/builtin/game/features.lua index 2aad458da..646b254ea 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -9,6 +9,7 @@ core.features = { no_legacy_abms = true, texture_names_parens = true, area_store_custom_ids = true, + add_entity_with_staticdata = true, } function core.has_feature(arg) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index d05db9d49..fc0f8e1fc 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2173,7 +2173,7 @@ and `minetest.auth_reload` call the authetification handler. * `minetest.get_node_timer(pos)` * Get `NodeTimerRef` -* `minetest.add_entity(pos, name)`: Spawn Lua-defined entity at position +* `minetest.add_entity(pos, name, [staticdata])`: Spawn Lua-defined entity at position * Returns `ObjectRef`, or `nil` if failed * `minetest.add_item(pos, item)`: Spawn item * Returns `ObjectRef`, or `nil` if failed diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 68d10308c..3d9db7917 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -440,7 +440,7 @@ int ModApiEnvMod::l_get_node_timer(lua_State *L) return 1; } -// add_entity(pos, entityname) -> ObjectRef or nil +// add_entity(pos, entityname, [staticdata]) -> ObjectRef or nil // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_add_entity(lua_State *L) { @@ -450,8 +450,10 @@ int ModApiEnvMod::l_add_entity(lua_State *L) v3f pos = checkFloatPos(L, 1); // content const char *name = luaL_checkstring(L, 2); + // staticdata + const char *staticdata = luaL_optstring(L, 3, ""); // Do it - ServerActiveObject *obj = new LuaEntitySAO(env, pos, name, ""); + ServerActiveObject *obj = new LuaEntitySAO(env, pos, name, staticdata); int objectid = env->addActiveObject(obj); // If failed to add, return nothing (reads as nil) if(objectid == 0) From 66479394037baa941cb06d75d3afc79ff4c717a2 Mon Sep 17 00:00:00 2001 From: Rogier Date: Tue, 10 Jan 2017 04:39:45 +0900 Subject: [PATCH 045/586] Performance fix + SAO factorization Original credits goes to @Rogier-5 * Merge common attributes between LuaEntitySAO & PlayerSAO to UnitSAO * Make some functions const * Improve some lists performance by returning const ref Signed-off-by: Loic Blot --- src/activeobject.h | 6 +-- src/clientobject.h | 4 +- src/content_cao.cpp | 6 +-- src/content_cao.h | 2 +- src/content_sao.cpp | 85 +++++++++++++++----------------- src/content_sao.h | 87 +++++++++++++-------------------- src/script/lua_api/l_object.cpp | 7 ++- src/serverobject.h | 8 +-- 8 files changed, 88 insertions(+), 117 deletions(-) diff --git a/src/activeobject.h b/src/activeobject.h index 48f078d3f..fe6c08514 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -64,7 +64,7 @@ public: m_id(id) { } - + u16 getId() { return m_id; @@ -76,8 +76,8 @@ public: } virtual ActiveObjectType getType() const = 0; - virtual bool getCollisionBox(aabb3f *toset) = 0; - virtual bool collideWithObjects() = 0; + virtual bool getCollisionBox(aabb3f *toset) const = 0; + virtual bool collideWithObjects() const = 0; protected: u16 m_id; // 0 is invalid, "no id" }; diff --git a/src/clientobject.h b/src/clientobject.h index f0bde0adc..1db5bcf24 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -47,8 +47,8 @@ public: virtual void updateLightNoCheck(u8 light_at_pos){} virtual v3s16 getLightPosition(){return v3s16(0,0,0);} virtual aabb3f *getSelectionBox() { return NULL; } - virtual bool getCollisionBox(aabb3f *toset){return false;} - virtual bool collideWithObjects(){return false;} + virtual bool getCollisionBox(aabb3f *toset) const { return false; } + virtual bool collideWithObjects() const { return false; } virtual v3f getPosition(){return v3f(0,0,0);} virtual float getYaw() const {return 0;} virtual scene::ISceneNode *getSceneNode(){return NULL;} diff --git a/src/content_cao.cpp b/src/content_cao.cpp index a4c0bf14d..5ddbd27c9 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -159,7 +159,7 @@ public: void processMessage(const std::string &data); - bool getCollisionBox(aabb3f *toset) { return false; } + bool getCollisionBox(aabb3f *toset) const { return false; } private: scene::IMeshSceneNode *m_node; v3f m_position; @@ -316,7 +316,7 @@ public: std::string infoText() {return m_infotext;} - bool getCollisionBox(aabb3f *toset) { return false; } + bool getCollisionBox(aabb3f *toset) const { return false; } private: aabb3f m_selection_box; scene::IMeshSceneNode *m_node; @@ -587,7 +587,7 @@ GenericCAO::GenericCAO(Client *client, ClientEnvironment *env): } } -bool GenericCAO::getCollisionBox(aabb3f *toset) +bool GenericCAO::getCollisionBox(aabb3f *toset) const { if (m_prop.physical) { diff --git a/src/content_cao.h b/src/content_cao.h index 96a160055..19fecdde5 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -130,7 +130,7 @@ public: ClientActiveObject *getParent(); - bool getCollisionBox(aabb3f *toset); + bool getCollisionBox(aabb3f *toset) const; bool collideWithObjects(); diff --git a/src/content_sao.cpp b/src/content_sao.cpp index dd8bdc592..c403a3673 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -19,11 +19,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "util/serialize.h" -#include "util/mathconstants.h" #include "collision.h" #include "environment.h" -#include "settings.h" -#include "serialization.h" // For compressZlib #include "tool.h" // For ToolCapabilities #include "gamedef.h" #include "nodedef.h" @@ -31,7 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server.h" #include "scripting_game.h" #include "genericobject.h" -#include "log.h" std::map ServerActiveObject::m_types; @@ -94,13 +90,8 @@ public: } } - bool getCollisionBox(aabb3f *toset) { - return false; - } - - bool collideWithObjects() { - return false; - } + bool getCollisionBox(aabb3f *toset) const { return false; } + bool collideWithObjects() const { return false; } private: float m_timer1; @@ -110,6 +101,28 @@ private: // Prototype (registers item for deserialization) TestSAO proto_TestSAO(NULL, v3f(0,0,0)); +/* + UnitSAO + */ + +UnitSAO::UnitSAO(ServerEnvironment *env, v3f pos): + ServerActiveObject(env, pos), + m_hp(-1), + m_yaw(0), + m_properties_sent(true), + m_armor_groups_sent(false), + m_animation_range(0,0), + m_animation_speed(0), + m_animation_blend(0), + m_animation_loop(true), + m_animation_sent(false), + m_bone_position_sent(false), + m_attachment_parent_id(0), + m_attachment_sent(false) +{ + // Initialize something to armor groups + m_armor_groups["fleshy"] = 100; +} /* LuaEntitySAO */ @@ -125,29 +138,17 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, m_registered(false), m_velocity(0,0,0), m_acceleration(0,0,0), - m_properties_sent(true), m_last_sent_yaw(0), m_last_sent_position(0,0,0), m_last_sent_velocity(0,0,0), m_last_sent_position_timer(0), - m_last_sent_move_precision(0), - m_armor_groups_sent(false), - m_animation_speed(0), - m_animation_blend(0), - m_animation_loop(true), - m_animation_sent(false), - m_bone_position_sent(false), - m_attachment_parent_id(0), - m_attachment_sent(false) + m_last_sent_move_precision(0) { // Only register type if no environment supplied if(env == NULL){ ServerActiveObject::registerType(getType(), create); return; } - - // Initialize something to armor groups - m_armor_groups["fleshy"] = 100; } LuaEntitySAO::~LuaEntitySAO() @@ -565,7 +566,7 @@ void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups) m_armor_groups_sent = false; } -ItemGroupList LuaEntitySAO::getArmorGroups() +const ItemGroupList &LuaEntitySAO::getArmorGroups() { return m_armor_groups; } @@ -635,7 +636,7 @@ void LuaEntitySAO::removeAttachmentChild(int child_id) m_attachment_child_ids.erase(child_id); } -UNORDERED_SET LuaEntitySAO::getAttachmentChildIds() +const UNORDERED_SET &LuaEntitySAO::getAttachmentChildIds() { return m_attachment_child_ids; } @@ -732,7 +733,8 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) m_messages_out.push(aom); } -bool LuaEntitySAO::getCollisionBox(aabb3f *toset) { +bool LuaEntitySAO::getCollisionBox(aabb3f *toset) const +{ if (m_prop.physical) { //update collision box @@ -748,7 +750,8 @@ bool LuaEntitySAO::getCollisionBox(aabb3f *toset) { return false; } -bool LuaEntitySAO::collideWithObjects(){ +bool LuaEntitySAO::collideWithObjects() const +{ return m_prop.collideWithObjects; } @@ -770,16 +773,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer m_nocheat_dig_time(0), m_wield_index(0), m_position_not_sent(false), - m_armor_groups_sent(false), - m_properties_sent(true), m_is_singleplayer(is_singleplayer), - m_animation_speed(0), - m_animation_blend(0), - m_animation_loop(true), - m_animation_sent(false), - m_bone_position_sent(false), - m_attachment_parent_id(0), - m_attachment_sent(false), m_breath(PLAYER_MAX_BREATH), m_pitch(0), m_fov(0), @@ -793,7 +787,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer m_physics_override_sent(false) { assert(m_peer_id != 0); // pre-condition - m_armor_groups["fleshy"] = 100; m_prop.hp_max = PLAYER_MAX_HP; m_prop.physical = false; @@ -828,6 +821,11 @@ void PlayerSAO::initialize(RemotePlayer *player, const std::set &pr m_inventory = &m_player->inventory; } +v3f PlayerSAO::getEyeOffset() const +{ + return v3f(0, BS * 1.625f, 0); +} + std::string PlayerSAO::getDescription() { return std::string("player ") + m_player->getName(); @@ -1282,7 +1280,7 @@ void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups) m_armor_groups_sent = false; } -ItemGroupList PlayerSAO::getArmorGroups() +const ItemGroupList &PlayerSAO::getArmorGroups() { return m_armor_groups; } @@ -1354,7 +1352,7 @@ void PlayerSAO::removeAttachmentChild(int child_id) m_attachment_child_ids.erase(child_id); } -UNORDERED_SET PlayerSAO::getAttachmentChildIds() +const UNORDERED_SET &PlayerSAO::getAttachmentChildIds() { return m_attachment_child_ids; } @@ -1512,15 +1510,10 @@ bool PlayerSAO::checkMovementCheat() return cheated; } -bool PlayerSAO::getCollisionBox(aabb3f *toset) +bool PlayerSAO::getCollisionBox(aabb3f *toset) const { *toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30); toset->MinEdge += m_base_position; toset->MaxEdge += m_base_position; return true; } - -bool PlayerSAO::collideWithObjects() -{ - return true; -} diff --git a/src/content_sao.h b/src/content_sao.h index 9c66068b3..d5e9b2cbf 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -24,14 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serverobject.h" #include "itemgroup.h" #include "object_properties.h" -#include "constants.h" class UnitSAO: public ServerActiveObject { public: - UnitSAO(ServerEnvironment *env, v3f pos): - ServerActiveObject(env, pos), - m_hp(-1), m_yaw(0) {} + UnitSAO(ServerEnvironment *env, v3f pos); virtual ~UnitSAO() {} virtual void setYaw(const float yaw) { m_yaw = yaw; } @@ -46,6 +43,29 @@ public: protected: s16 m_hp; float m_yaw; + + bool m_properties_sent; + struct ObjectProperties m_prop; + + ItemGroupList m_armor_groups; + bool m_armor_groups_sent; + + v2f m_animation_range; + float m_animation_speed; + float m_animation_blend; + bool m_animation_loop; + bool m_animation_sent; + + // Stores position and rotation for each bone name + UNORDERED_MAP > m_bone_position; + bool m_bone_position_sent; + + int m_attachment_parent_id; + UNORDERED_SET m_attachment_child_ids; + std::string m_attachment_bone; + v3f m_attachment_position; + v3f m_attachment_rotation; + bool m_attachment_sent; }; /* @@ -81,7 +101,7 @@ public: void setHP(s16 hp); s16 getHP() const; void setArmorGroups(const ItemGroupList &armor_groups); - ItemGroupList getArmorGroups(); + const ItemGroupList &getArmorGroups(); void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); void setBonePosition(const std::string &bone, v3f position, v3f rotation); @@ -90,7 +110,7 @@ public: void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); - UNORDERED_SET getAttachmentChildIds(); + const UNORDERED_SET &getAttachmentChildIds(); ObjectProperties* accessObjectProperties(); void notifyObjectPropertiesModified(); /* LuaEntitySAO-specific */ @@ -103,8 +123,8 @@ public: void setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch); std::string getName(); - bool getCollisionBox(aabb3f *toset); - bool collideWithObjects(); + bool getCollisionBox(aabb3f *toset) const; + bool collideWithObjects() const; private: std::string getPropertyPacket(); void sendPosition(bool do_interpolate, bool is_movement_end); @@ -112,36 +132,15 @@ private: std::string m_init_name; std::string m_init_state; bool m_registered; - struct ObjectProperties m_prop; v3f m_velocity; v3f m_acceleration; - ItemGroupList m_armor_groups; - - bool m_properties_sent; float m_last_sent_yaw; v3f m_last_sent_position; v3f m_last_sent_velocity; float m_last_sent_position_timer; float m_last_sent_move_precision; - bool m_armor_groups_sent; - - v2f m_animation_range; - float m_animation_speed; - float m_animation_blend; - bool m_animation_loop; - bool m_animation_sent; - - UNORDERED_MAP > m_bone_position; - bool m_bone_position_sent; - - int m_attachment_parent_id; - UNORDERED_SET m_attachment_child_ids; - std::string m_attachment_bone; - v3f m_attachment_position; - v3f m_attachment_rotation; - bool m_attachment_sent; }; /* @@ -235,7 +234,7 @@ public: u16 getBreath() const { return m_breath; } void setBreath(const u16 breath, bool send = true); void setArmorGroups(const ItemGroupList &armor_groups); - ItemGroupList getArmorGroups(); + const ItemGroupList &getArmorGroups(); void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); void setBonePosition(const std::string &bone, v3f position, v3f rotation); @@ -244,7 +243,7 @@ public: void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); - UNORDERED_SET getAttachmentChildIds(); + const UNORDERED_SET &getAttachmentChildIds(); ObjectProperties* accessObjectProperties(); void notifyObjectPropertiesModified(); @@ -315,13 +314,13 @@ public: m_is_singleplayer = is_singleplayer; } - bool getCollisionBox(aabb3f *toset); - bool collideWithObjects(); + bool getCollisionBox(aabb3f *toset) const; + bool collideWithObjects() const { return true; } void initialize(RemotePlayer *player, const std::set &privs); v3f getEyePosition() const { return m_base_position + getEyeOffset(); } - v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); } + v3f getEyeOffset() const; private: std::string getPropertyPacket(); @@ -346,31 +345,11 @@ private: int m_wield_index; bool m_position_not_sent; - ItemGroupList m_armor_groups; - bool m_armor_groups_sent; - bool m_properties_sent; - struct ObjectProperties m_prop; // Cached privileges for enforcement std::set m_privs; bool m_is_singleplayer; - v2f m_animation_range; - float m_animation_speed; - float m_animation_blend; - bool m_animation_loop; - bool m_animation_sent; - - // Stores position and rotation for each bone name - UNORDERED_MAP > m_bone_position; - bool m_bone_position_sent; - - int m_attachment_parent_id; - UNORDERED_SET m_attachment_child_ids; - std::string m_attachment_bone; - v3f m_attachment_position; - v3f m_attachment_rotation; - bool m_attachment_sent; u16 m_breath; f32 m_pitch; f32 m_fov; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index cfdceb28e..84d14d521 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -137,8 +137,8 @@ int ObjectRef::l_remove(lua_State *L) if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; - UNORDERED_SET child_ids = co->getAttachmentChildIds(); - UNORDERED_SET::iterator it; + const UNORDERED_SET &child_ids = co->getAttachmentChildIds(); + UNORDERED_SET::const_iterator it; for (it = child_ids.begin(); it != child_ids.end(); ++it) { // Child can be NULL if it was deleted earlier if (ServerActiveObject *child = env->getActiveObject(*it)) @@ -396,8 +396,7 @@ int ObjectRef::l_get_armor_groups(lua_State *L) if (co == NULL) return 0; // Do it - ItemGroupList groups = co->getArmorGroups(); - push_groups(L, groups); + push_groups(L, co->getArmorGroups()); return 1; } diff --git a/src/serverobject.h b/src/serverobject.h index 9884eb0a1..9e8b5a779 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -146,8 +146,8 @@ public: virtual void setArmorGroups(const ItemGroupList &armor_groups) {} - virtual ItemGroupList getArmorGroups() - { return ItemGroupList(); } + virtual const ItemGroupList &getArmorGroups() + { static const ItemGroupList rv; return rv; } virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) {} virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) @@ -166,8 +166,8 @@ public: {} virtual void removeAttachmentChild(int child_id) {} - virtual UNORDERED_SET getAttachmentChildIds() - { return UNORDERED_SET(); } + virtual const UNORDERED_SET &getAttachmentChildIds() + { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() { return NULL; } virtual void notifyObjectPropertiesModified() From 430d3b28e46b16e1411ec0ecb6c0d0ab9d6feb63 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 11 Jan 2017 09:03:07 +0100 Subject: [PATCH 046/586] Cleanup some header inclusions to improve compilation times --- src/client.h | 1 + src/clientenvironment.cpp | 1 + src/environment.h | 4 ++-- src/guiFormSpecMenu.h | 1 - src/localplayer.cpp | 11 +++++++++++ src/localplayer.h | 11 ++--------- src/minimap.cpp | 1 + src/network/serverpackethandler.cpp | 1 + src/player.h | 1 - src/serverenvironment.h | 3 +++ 10 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/client.h b/src/client.h index df3e7e605..f84246deb 100644 --- a/src/client.h +++ b/src/client.h @@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include "hud.h" #include "particles.h" +#include "mapnode.h" struct MeshMakeData; class MapBlockMesh; diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp index 65646c6b4..b32a02f2d 100644 --- a/src/clientenvironment.cpp +++ b/src/clientenvironment.cpp @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" #include "raycast.h" #include "voxelalgorithms.h" +#include "settings.h" /* ClientEnvironment diff --git a/src/environment.h b/src/environment.h index 0cc3222f9..5154bbdcb 100644 --- a/src/environment.h +++ b/src/environment.h @@ -36,12 +36,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irr_v3d.h" #include "activeobject.h" #include "util/numeric.h" -#include "mapnode.h" -#include "mapblock.h" #include "threading/mutex.h" #include "threading/atomic.h" #include "network/networkprotocol.h" // for AccessDeniedCode +class Map; + class Environment { public: diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 94b52e6f0..2ab7db4f1 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "irrlichttypes_extrabloated.h" -#include "inventory.h" #include "inventorymanager.h" #include "modalMenu.h" #include "guiTable.h" diff --git a/src/localplayer.cpp b/src/localplayer.cpp index b859c6455..857d95d8b 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -655,6 +655,17 @@ v3s16 LocalPlayer::getStandingNodePos() return floatToInt(getPosition() - v3f(0, BS, 0), BS); } +v3s16 LocalPlayer::getLightPosition() const +{ + return floatToInt(m_position + v3f(0,BS+BS/2,0), BS); +} + +v3f LocalPlayer::getEyeOffset() const +{ + float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f; + return v3f(0, BS * eye_height, 0); +} + // Horizontal acceleration (X and Z), Y direction is ignored void LocalPlayer::accelerateHorizontal(const v3f &target_speed, const f32 max_increase) { diff --git a/src/localplayer.h b/src/localplayer.h index cbdcb9867..685a78cb3 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -105,10 +105,7 @@ public: u16 getBreath() const { return m_breath; } void setBreath(u16 breath) { m_breath = breath; } - v3s16 getLightPosition() const - { - return floatToInt(m_position + v3f(0,BS+BS/2,0), BS); - } + v3s16 getLightPosition() const; void setYaw(f32 yaw) { @@ -131,11 +128,7 @@ public: v3f getPosition() const { return m_position; } v3f getEyePosition() const { return m_position + getEyeOffset(); } - v3f getEyeOffset() const - { - float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f; - return v3f(0, BS * eye_height, 0); - } + v3f getEyeOffset() const; private: void accelerateHorizontal(const v3f &target_speed, const f32 max_increase); void accelerateVertical(const v3f &target_speed, const f32 max_increase); diff --git a/src/minimap.cpp b/src/minimap.cpp index 8cd0a7beb..f49adb517 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "util/numeric.h" #include "util/string.h" +#include "mapblock.h" #include diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index eeabcca71..408fe7706 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_abm.h" #include "content_sao.h" #include "emerge.h" +#include "mapblock.h" #include "nodedef.h" #include "player.h" #include "rollback_interface.h" diff --git a/src/player.h b/src/player.h index 5f9bb7ec9..3432069c0 100644 --- a/src/player.h +++ b/src/player.h @@ -22,7 +22,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "inventory.h" -#include "constants.h" // BS #include "threading/mutex.h" #include diff --git a/src/serverenvironment.h b/src/serverenvironment.h index d71d29a9c..b7056c00c 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -21,6 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #define SERVER_ENVIRONMENT_HEADER #include "environment.h" +#include "mapnode.h" +#include "mapblock.h" +#include class IGameDef; class ServerMap; From 5d60a6c533efb572a4004d110536da63bb62c58a Mon Sep 17 00:00:00 2001 From: Rui Date: Thu, 12 Jan 2017 04:25:25 +0900 Subject: [PATCH 047/586] Make nametag removable with set_nametag_attributes (#5021) --- src/script/lua_api/l_object.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 84d14d521..506e56df9 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -789,8 +789,7 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) lua_pop(L, 1); std::string nametag = getstringfield_default(L, 2, "text", ""); - if (nametag != "") - prop->nametag = nametag; + prop->nametag = nametag; co->notifyObjectPropertiesModified(); lua_pushboolean(L, true); From 25ba96fcac9fce7bfa9dd6e9c2c3e96e2d5e147e Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 24 Dec 2016 06:40:57 +0000 Subject: [PATCH 048/586] Meshes: Make object mesh face shading consistent Previously, object meshes had their North and South faces darker than East and West faces, the opposite of nodes and meshnodes. This commit corrects this. State constants as float-literals not double-literals. Simplify code. Add comment. --- src/mesh.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index b68862d22..50465748c 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -186,17 +186,14 @@ void shadeMeshFaces(scene::IMesh *mesh) for (u32 i = 0; i < vertex_count; i++) { video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride); video::SColor &vc = vertex->Color; - if (vertex->Normal.Y < -0.5) { - applyFacesShading (vc, 0.447213); - } else if (vertex->Normal.Z > 0.5) { - applyFacesShading (vc, 0.670820); - } else if (vertex->Normal.Z < -0.5) { - applyFacesShading (vc, 0.670820); - } else if (vertex->Normal.X > 0.5) { - applyFacesShading (vc, 0.836660); - } else if (vertex->Normal.X < -0.5) { - applyFacesShading (vc, 0.836660); - } + // Many special drawtypes have normals set to 0,0,0 and this + // must result in maximum brightness (no face shadng). + if (vertex->Normal.Y < -0.5f) + applyFacesShading (vc, 0.447213f); + else if (vertex->Normal.X > 0.5f || vertex->Normal.X < -0.5f) + applyFacesShading (vc, 0.670820f); + else if (vertex->Normal.Z > 0.5f || vertex->Normal.Z < -0.5f) + applyFacesShading (vc, 0.836660f); } } } From 7ae7f1ea4cbbda7d7849a1240ce30d867e850bfb Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 9 Oct 2016 14:36:22 -0400 Subject: [PATCH 049/586] Enable mod security by default --- builtin/settingtypes.txt | 2 +- minetest.conf.example | 2 +- src/defaultsettings.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 8668e1472..779224be4 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1186,7 +1186,7 @@ mgvalleys_np_inter_valley_slope (Valley Slope) noise_params 0.5, 0.5, (128, 128, [*Security] # Prevent mods from doing insecure things like running shell commands. -secure.enable_security (Enable mod security) bool false +secure.enable_security (Enable mod security) bool true # Comma-separated list of trusted mods that are allowed to access insecure # functions even when mod security is on (via request_insecure_environment()). diff --git a/minetest.conf.example b/minetest.conf.example index bf70f5e51..13b2dc7a7 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1530,7 +1530,7 @@ # Prevent mods from doing insecure things like running shell commands. # type: bool -# secure.enable_security = false +# secure.enable_security = true # Comma-separated list of trusted mods that are allowed to access insecure # functions even when mod security is on (via request_insecure_environment()). diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 52f4cfec8..1096b8904 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -303,7 +303,7 @@ void set_default_settings(Settings *settings) settings->setDefault("emergequeue_limit_diskonly", "32"); settings->setDefault("emergequeue_limit_generate", "32"); settings->setDefault("num_emerge_threads", "1"); - settings->setDefault("secure.enable_security", "false"); + settings->setDefault("secure.enable_security", "true"); settings->setDefault("secure.trusted_mods", ""); settings->setDefault("secure.http_mods", ""); From e2dd96b432f057cd8a3886314c78a79138a99c5e Mon Sep 17 00:00:00 2001 From: Rogier Date: Thu, 12 Jan 2017 04:25:25 +0900 Subject: [PATCH 050/586] Cleanup content_sao by factorizing similar code parts Signed-off-by: Loic Blot --- src/content_sao.cpp | 324 +++++++++++++++----------------------------- src/content_sao.h | 51 +++---- 2 files changed, 126 insertions(+), 249 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index c403a3673..852e2d788 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -123,6 +123,111 @@ UnitSAO::UnitSAO(ServerEnvironment *env, v3f pos): // Initialize something to armor groups m_armor_groups["fleshy"] = 100; } + +bool UnitSAO::isAttached() const +{ + if (!m_attachment_parent_id) + return false; + // Check if the parent still exists + ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); + if (obj) + return true; + return false; +} + +void UnitSAO::setArmorGroups(const ItemGroupList &armor_groups) +{ + m_armor_groups = armor_groups; + m_armor_groups_sent = false; +} + +const ItemGroupList &UnitSAO::getArmorGroups() +{ + return m_armor_groups; +} + +void UnitSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop) +{ + // store these so they can be updated to clients + m_animation_range = frame_range; + m_animation_speed = frame_speed; + m_animation_blend = frame_blend; + m_animation_loop = frame_loop; + m_animation_sent = false; +} + +void UnitSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop) +{ + *frame_range = m_animation_range; + *frame_speed = m_animation_speed; + *frame_blend = m_animation_blend; + *frame_loop = m_animation_loop; +} + +void UnitSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation) +{ + // store these so they can be updated to clients + m_bone_position[bone] = core::vector2d(position, rotation); + m_bone_position_sent = false; +} + +void UnitSAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) +{ + *position = m_bone_position[bone].X; + *rotation = m_bone_position[bone].Y; +} + +void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) +{ + // Attachments need to be handled on both the server and client. + // If we just attach on the server, we can only copy the position of the parent. Attachments + // are still sent to clients at an interval so players might see them lagging, plus we can't + // read and attach to skeletal bones. + // If we just attach on the client, the server still sees the child at its original location. + // This breaks some things so we also give the server the most accurate representation + // even if players only see the client changes. + + m_attachment_parent_id = parent_id; + m_attachment_bone = bone; + m_attachment_position = position; + m_attachment_rotation = rotation; + m_attachment_sent = false; +} + +void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, + v3f *rotation) +{ + *parent_id = m_attachment_parent_id; + *bone = m_attachment_bone; + *position = m_attachment_position; + *rotation = m_attachment_rotation; +} + +void UnitSAO::addAttachmentChild(int child_id) +{ + m_attachment_child_ids.insert(child_id); +} + +void UnitSAO::removeAttachmentChild(int child_id) +{ + m_attachment_child_ids.erase(child_id); +} + +const UNORDERED_SET &UnitSAO::getAttachmentChildIds() +{ + return m_attachment_child_ids; +} + +ObjectProperties* UnitSAO::accessObjectProperties() +{ + return &m_prop; +} + +void UnitSAO::notifyObjectPropertiesModified() +{ + m_properties_sent = false; +} + /* LuaEntitySAO */ @@ -220,17 +325,6 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, return sao; } -bool LuaEntitySAO::isAttached() -{ - if(!m_attachment_parent_id) - return false; - // Check if the parent still exists - ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); - if(obj) - return true; - return false; -} - void LuaEntitySAO::step(float dtime, bool send_recommended) { if(!m_properties_sent) @@ -427,7 +521,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) return os.str(); } -std::string LuaEntitySAO::getStaticData() +std::string LuaEntitySAO::getStaticData() const { verbosestream<(position, rotation); - m_bone_position_sent = false; -} - -void LuaEntitySAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) -{ - *position = m_bone_position[bone].X; - *rotation = m_bone_position[bone].Y; -} - -void LuaEntitySAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) -{ - // Attachments need to be handled on both the server and client. - // If we just attach on the server, we can only copy the position of the parent. Attachments - // are still sent to clients at an interval so players might see them lagging, plus we can't - // read and attach to skeletal bones. - // If we just attach on the client, the server still sees the child at its original location. - // This breaks some things so we also give the server the most accurate representation - // even if players only see the client changes. - - m_attachment_parent_id = parent_id; - m_attachment_bone = bone; - m_attachment_position = position; - m_attachment_rotation = rotation; - m_attachment_sent = false; -} - -void LuaEntitySAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) -{ - *parent_id = m_attachment_parent_id; - *bone = m_attachment_bone; - *position = m_attachment_position; - *rotation = m_attachment_rotation; -} - -void LuaEntitySAO::addAttachmentChild(int child_id) -{ - m_attachment_child_ids.insert(child_id); -} - -void LuaEntitySAO::removeAttachmentChild(int child_id) -{ - m_attachment_child_ids.erase(child_id); -} - -const UNORDERED_SET &LuaEntitySAO::getAttachmentChildIds() -{ - return m_attachment_child_ids; -} - -ObjectProperties* LuaEntitySAO::accessObjectProperties() -{ - return &m_prop; -} - -void LuaEntitySAO::notifyObjectPropertiesModified() -{ - m_properties_sent = false; -} - void LuaEntitySAO::setVelocity(v3f velocity) { m_velocity = velocity; @@ -854,11 +857,6 @@ void PlayerSAO::removingFromEnvironment() } } -bool PlayerSAO::isStaticAllowed() const -{ - return false; -} - std::string PlayerSAO::getClientInitializationData(u16 protocol_version) { std::ostringstream os(std::ios::binary); @@ -920,23 +918,12 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) return os.str(); } -std::string PlayerSAO::getStaticData() +std::string PlayerSAO::getStaticData() const { FATAL_ERROR("Deprecated function (?)"); return ""; } -bool PlayerSAO::isAttached() -{ - if(!m_attachment_parent_id) - return false; - // Check if the parent still exists - ServerActiveObject *obj = m_env->getActiveObject(m_attachment_parent_id); - if(obj) - return true; - return false; -} - void PlayerSAO::step(float dtime, bool send_recommended) { if (m_drowning_interval.step(dtime, 2.0)) { @@ -1224,10 +1211,6 @@ int PlayerSAO::punch(v3f dir, return hitparams.wear; } -void PlayerSAO::rightClick(ServerActiveObject *) -{ -} - s16 PlayerSAO::readDamage() { s16 damage = m_damage; @@ -1274,99 +1257,6 @@ void PlayerSAO::setBreath(const u16 breath, bool send) m_env->getGameDef()->SendPlayerBreath(this); } -void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups) -{ - m_armor_groups = armor_groups; - m_armor_groups_sent = false; -} - -const ItemGroupList &PlayerSAO::getArmorGroups() -{ - return m_armor_groups; -} - -void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop) -{ - // store these so they can be updated to clients - m_animation_range = frame_range; - m_animation_speed = frame_speed; - m_animation_blend = frame_blend; - m_animation_loop = frame_loop; - m_animation_sent = false; -} - -void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop) -{ - *frame_range = m_animation_range; - *frame_speed = m_animation_speed; - *frame_blend = m_animation_blend; - *frame_loop = m_animation_loop; -} - -void PlayerSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation) -{ - // store these so they can be updated to clients - m_bone_position[bone] = core::vector2d(position, rotation); - m_bone_position_sent = false; -} - -void PlayerSAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) -{ - *position = m_bone_position[bone].X; - *rotation = m_bone_position[bone].Y; -} - -void PlayerSAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) -{ - // Attachments need to be handled on both the server and client. - // If we just attach on the server, we can only copy the position of the parent. Attachments - // are still sent to clients at an interval so players might see them lagging, plus we can't - // read and attach to skeletal bones. - // If we just attach on the client, the server still sees the child at its original location. - // This breaks some things so we also give the server the most accurate representation - // even if players only see the client changes. - - m_attachment_parent_id = parent_id; - m_attachment_bone = bone; - m_attachment_position = position; - m_attachment_rotation = rotation; - m_attachment_sent = false; -} - -void PlayerSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) -{ - *parent_id = m_attachment_parent_id; - *bone = m_attachment_bone; - *position = m_attachment_position; - *rotation = m_attachment_rotation; -} - -void PlayerSAO::addAttachmentChild(int child_id) -{ - m_attachment_child_ids.insert(child_id); -} - -void PlayerSAO::removeAttachmentChild(int child_id) -{ - m_attachment_child_ids.erase(child_id); -} - -const UNORDERED_SET &PlayerSAO::getAttachmentChildIds() -{ - return m_attachment_child_ids; -} - -ObjectProperties* PlayerSAO::accessObjectProperties() -{ - return &m_prop; -} - -void PlayerSAO::notifyObjectPropertiesModified() -{ - m_properties_sent = false; -} - Inventory* PlayerSAO::getInventory() { return m_inventory; diff --git a/src/content_sao.h b/src/content_sao.h index d5e9b2cbf..4d6cf4dcf 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -40,6 +40,21 @@ public: s16 getHP() const { return m_hp; } // Use a function, if isDead can be defined by other conditions bool isDead() const { return m_hp == 0; } + + bool isAttached() const; + void setArmorGroups(const ItemGroupList &armor_groups); + const ItemGroupList &getArmorGroups(); + void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); + void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); + void setBonePosition(const std::string &bone, v3f position, v3f rotation); + void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); + void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); + void addAttachmentChild(int child_id); + void removeAttachmentChild(int child_id); + const UNORDERED_SET &getAttachmentChildIds(); + ObjectProperties* accessObjectProperties(); + void notifyObjectPropertiesModified(); protected: s16 m_hp; float m_yaw; @@ -85,10 +100,9 @@ public: virtual void addedToEnvironment(u32 dtime_s); static ServerActiveObject* create(ServerEnvironment *env, v3f pos, const std::string &data); - bool isAttached(); void step(float dtime, bool send_recommended); std::string getClientInitializationData(u16 protocol_version); - std::string getStaticData(); + std::string getStaticData() const; int punch(v3f dir, const ToolCapabilities *toolcap=NULL, ServerActiveObject *puncher=NULL, @@ -100,19 +114,6 @@ public: std::string getDescription(); void setHP(s16 hp); s16 getHP() const; - void setArmorGroups(const ItemGroupList &armor_groups); - const ItemGroupList &getArmorGroups(); - void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); - void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); - void setBonePosition(const std::string &bone, v3f position, v3f rotation); - void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); - void addAttachmentChild(int child_id); - void removeAttachmentChild(int child_id); - const UNORDERED_SET &getAttachmentChildIds(); - ObjectProperties* accessObjectProperties(); - void notifyObjectPropertiesModified(); /* LuaEntitySAO-specific */ void setVelocity(v3f velocity); v3f getVelocity(); @@ -196,10 +197,9 @@ public: void addedToEnvironment(u32 dtime_s); void removingFromEnvironment(); - bool isStaticAllowed() const; + bool isStaticAllowed() const { return false; } std::string getClientInitializationData(u16 protocol_version); - std::string getStaticData(); - bool isAttached(); + std::string getStaticData() const; void step(float dtime, bool send_recommended); void setBasePosition(const v3f &position); void setPos(const v3f &pos); @@ -227,25 +227,12 @@ public: const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch); - void rightClick(ServerActiveObject *clicker); + void rightClick(ServerActiveObject *clicker) {} void setHP(s16 hp); void setHPRaw(s16 hp) { m_hp = hp; } s16 readDamage(); u16 getBreath() const { return m_breath; } void setBreath(const u16 breath, bool send = true); - void setArmorGroups(const ItemGroupList &armor_groups); - const ItemGroupList &getArmorGroups(); - void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); - void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); - void setBonePosition(const std::string &bone, v3f position, v3f rotation); - void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); - void addAttachmentChild(int child_id); - void removeAttachmentChild(int child_id); - const UNORDERED_SET &getAttachmentChildIds(); - ObjectProperties* accessObjectProperties(); - void notifyObjectPropertiesModified(); /* Inventory interface From ef0aa7d5b543b6561e1b7292b2d0a0ac43add55d Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 11 Jan 2017 22:48:14 +0100 Subject: [PATCH 051/586] Optimize SAO getStaticData by using std::string pointer instead of return copy Signed-off-by: Loic Blot --- src/content_sao.cpp | 9 ++++----- src/content_sao.h | 4 ++-- src/serverenvironment.cpp | 9 ++++++--- src/serverobject.h | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 852e2d788..bf8282af4 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -521,7 +521,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) return os.str(); } -std::string LuaEntitySAO::getStaticData() const +void LuaEntitySAO::getStaticData(std::string *result) const { verbosestream<getBasePosition(); - std::string staticdata = object->getStaticData(); + std::string staticdata = ""; + object->getStaticData(&staticdata); StaticObject s_obj(object->getType(), objectpos, staticdata); // Add to the block where the object is located in v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); @@ -1980,7 +1981,8 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) <getStaticData(); + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); StaticObject s_obj(obj->getType(), objectpos, staticdata_new); block->m_static_objects.insert(id, s_obj); obj->m_static_block = blockpos_o; @@ -2020,7 +2022,8 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) if(obj->isStaticAllowed()) { // Create new static object - std::string staticdata_new = obj->getStaticData(); + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); StaticObject s_obj(obj->getType(), objectpos, staticdata_new); bool stays_in_same_block = false; diff --git a/src/serverobject.h b/src/serverobject.h index 9e8b5a779..26c8b062d 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -119,10 +119,10 @@ public: when it is created (converted from static to active - actually the data is the static form) */ - virtual std::string getStaticData() + virtual void getStaticData(std::string *result) { assert(isStaticAllowed()); - return ""; + *result = ""; } /* Return false in here to never save and instead remove object From bb154c2e1cf185f181c3e85df9addb79e6d18b4c Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Thu, 15 Oct 2015 13:05:33 -0400 Subject: [PATCH 052/586] Main menu tweaks --- builtin/init.lua | 7 +++---- builtin/mainmenu/dlg_settings_advanced.lua | 2 +- src/guiEngine.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/builtin/init.lua b/builtin/init.lua index 4400a19d6..b34ad14a0 100644 --- a/builtin/init.lua +++ b/builtin/init.lua @@ -37,9 +37,9 @@ dofile(commonpath .. "misc_helpers.lua") if INIT == "game" then dofile(gamepath .. "init.lua") elseif INIT == "mainmenu" then - local mainmenuscript = core.setting_get("main_menu_script") - if mainmenuscript ~= nil and mainmenuscript ~= "" then - dofile(mainmenuscript) + local mm_script = core.setting_get("main_menu_script") + if mm_script and mm_script ~= "" then + dofile(mm_script) else dofile(core.get_mainmenu_path() .. DIR_DELIM .. "init.lua") end @@ -48,4 +48,3 @@ elseif INIT == "async" then else error(("Unrecognized builtin initialization type %s!"):format(tostring(INIT))) end - diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua index 85218c852..60ec1250f 100644 --- a/builtin/mainmenu/dlg_settings_advanced.lua +++ b/builtin/mainmenu/dlg_settings_advanced.lua @@ -667,4 +667,4 @@ end -- The documentation of mapgen noise parameter formats (title plus 16 lines) -- Noise parameter 'mgv5_np_ground' in group format (13 lines) ---assert(loadfile(core.get_mainmenu_path()..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false)) +--assert(loadfile(core.get_builtin_path()..DIR_DELIM.."mainmenu"..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false)) diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index 6d66ed08d..03fee6b96 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -213,13 +213,13 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, m_data->script_data.errormessage = ""; if (!loadMainMenuScript()) { - errorstream << "No future without mainmenu" << std::endl; + errorstream << "No future without main menu!" << std::endl; abort(); } run(); } catch (LuaError &e) { - errorstream << "MAINMENU ERROR: " << e.what() << std::endl; + errorstream << "Main menu error: " << e.what() << std::endl; m_data->script_data.errormessage = e.what(); } @@ -231,13 +231,13 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, /******************************************************************************/ bool GUIEngine::loadMainMenuScript() { - // Try custom menu script (main_menu_path) - + // Set main menu path (for core.get_mainmenu_path()) m_scriptdir = g_settings->get("main_menu_path"); if (m_scriptdir.empty()) { - m_scriptdir = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "mainmenu"; + m_scriptdir = porting::path_share + DIR_DELIM + "builtin" + DIR_DELIM + "mainmenu"; } + // Load builtin (which will load the main menu script) std::string script = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "init.lua"; try { m_script->loadScript(script); From 80023660979e19b3607fdfb573adb76cb60da5f1 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Thu, 15 Oct 2015 13:16:26 -0400 Subject: [PATCH 053/586] Organize defaultsettings.cpp --- src/defaultsettings.cpp | 221 ++++++++++++++++++++-------------------- 1 file changed, 108 insertions(+), 113 deletions(-) diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 1096b8904..14a88b7a6 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -23,14 +23,39 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" #include "constants.h" #include "porting.h" +#include "util/string.h" void set_default_settings(Settings *settings) { // Client and server - + settings->setDefault("language", ""); settings->setDefault("name", ""); + settings->setDefault("bind_address", ""); + settings->setDefault("serverlist_url", "servers.minetest.net"); - // Client stuff + // Client + settings->setDefault("address", ""); + settings->setDefault("enable_sound", "true"); + settings->setDefault("sound_volume", "0.8"); + settings->setDefault("enable_mesh_cache", "false"); + settings->setDefault("enable_vbo", "true"); + settings->setDefault("free_move", "false"); + settings->setDefault("fast_move", "false"); + settings->setDefault("noclip", "false"); + settings->setDefault("screenshot_path", "."); + settings->setDefault("screenshot_format", "png"); + settings->setDefault("screenshot_quality", "0"); + settings->setDefault("client_unload_unused_data_timeout", "600"); + settings->setDefault("client_mapblock_limit", "5000"); + settings->setDefault("enable_build_where_you_stand", "false" ); + settings->setDefault("send_pre_v25_init", "false"); + settings->setDefault("curl_timeout", "5000"); + settings->setDefault("curl_parallel_limit", "8"); + settings->setDefault("curl_file_download_timeout", "300000"); + settings->setDefault("curl_verify_cert", "true"); + settings->setDefault("enable_remote_media_server", "true"); + + // Keymap settings->setDefault("remote_port", "30000"); settings->setDefault("keymap_forward", "KEY_KEY_W"); settings->setDefault("keymap_autorun", ""); @@ -52,31 +77,20 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_fastmove", "KEY_KEY_J"); settings->setDefault("keymap_noclip", "KEY_KEY_H"); settings->setDefault("keymap_cinematic", ""); - settings->setDefault("keymap_screenshot", "KEY_F12"); settings->setDefault("keymap_toggle_hud", "KEY_F1"); settings->setDefault("keymap_toggle_chat", "KEY_F2"); settings->setDefault("keymap_toggle_force_fog_off", "KEY_F3"); - settings->setDefault("keymap_toggle_update_camera", #if DEBUG - "KEY_F4"); + settings->setDefault("keymap_toggle_update_camera", "KEY_F4"); #else - ""); + settings->setDefault("keymap_toggle_update_camera", ""); #endif settings->setDefault("keymap_toggle_debug", "KEY_F5"); settings->setDefault("keymap_toggle_profiler", "KEY_F6"); settings->setDefault("keymap_camera_mode", "KEY_F7"); + settings->setDefault("keymap_screenshot", "KEY_F12"); settings->setDefault("keymap_increase_viewing_range_min", "+"); settings->setDefault("keymap_decrease_viewing_range_min", "-"); - settings->setDefault("enable_build_where_you_stand", "false" ); - settings->setDefault("3d_mode", "none"); - settings->setDefault("3d_paralax_strength", "0.025"); - settings->setDefault("aux1_descends", "false"); - settings->setDefault("doubletap_jump", "false"); - settings->setDefault("always_fly_fast", "true"); - settings->setDefault("directional_colored_fog", "true"); - settings->setDefault("tooltip_show_delay", "400"); - settings->setDefault("zoom_fov", "15"); - // Some (temporary) keys for debugging settings->setDefault("keymap_print_debug_stacks", "KEY_KEY_P"); settings->setDefault("keymap_quicktune_prev", "KEY_HOME"); @@ -84,31 +98,28 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_quicktune_dec", "KEY_NEXT"); settings->setDefault("keymap_quicktune_inc", "KEY_PRIOR"); - // Show debug info by default? - #ifdef NDEBUG + // Visuals +#ifdef NDEBUG settings->setDefault("show_debug", "false"); - #else +#else settings->setDefault("show_debug", "true"); - #endif - +#endif + settings->setDefault("fsaa", "0"); + settings->setDefault("enable_fog", "true"); + settings->setDefault("fog_start", "0.4"); + settings->setDefault("3d_mode", "none"); + settings->setDefault("3d_paralax_strength", "0.025"); + settings->setDefault("tooltip_show_delay", "400"); + settings->setDefault("zoom_fov", "15"); settings->setDefault("fps_max", "60"); settings->setDefault("pause_fps_max", "20"); settings->setDefault("viewing_range", "100"); - settings->setDefault("map_generation_limit", "31000"); settings->setDefault("screenW", "800"); settings->setDefault("screenH", "600"); settings->setDefault("fullscreen", "false"); settings->setDefault("fullscreen_bpp", "24"); - settings->setDefault("fsaa", "0"); settings->setDefault("vsync", "false"); - settings->setDefault("address", ""); - settings->setDefault("random_input", "false"); - settings->setDefault("client_unload_unused_data_timeout", "600"); - settings->setDefault("client_mapblock_limit", "5000"); - settings->setDefault("enable_fog", "true"); - settings->setDefault("fog_start", "0.4"); settings->setDefault("fov", "72"); - settings->setDefault("view_bobbing", "true"); settings->setDefault("leaves_style", "fancy"); settings->setDefault("connected_glass", "false"); settings->setDefault("smooth_lighting", "true"); @@ -116,21 +127,10 @@ void set_default_settings(Settings *settings) settings->setDefault("texture_path", ""); settings->setDefault("shader_path", ""); settings->setDefault("video_driver", "opengl"); - settings->setDefault("free_move", "false"); - settings->setDefault("noclip", "false"); - settings->setDefault("continuous_forward", "false"); - settings->setDefault("enable_joysticks", "false"); - settings->setDefault("repeat_joystick_button_time", "0.17"); - settings->setDefault("joystick_frustum_sensitivity", "170"); settings->setDefault("cinematic", "false"); settings->setDefault("camera_smoothing", "0"); settings->setDefault("cinematic_camera_smoothing", "0.7"); - settings->setDefault("fast_move", "false"); - settings->setDefault("invert_mouse", "false"); settings->setDefault("enable_clouds", "true"); - settings->setDefault("screenshot_path", "."); - settings->setDefault("screenshot_format", "png"); - settings->setDefault("screenshot_quality", "0"); settings->setDefault("view_bobbing_amount", "1.0"); settings->setDefault("fall_bobbing_amount", "0.0"); settings->setDefault("enable_3d_clouds", "true"); @@ -142,7 +142,6 @@ void set_default_settings(Settings *settings) settings->setDefault("console_alpha", "200"); settings->setDefault("selectionbox_color", "(0,0,0)"); settings->setDefault("selectionbox_width", "2"); - settings->setDefault("inventory_items_animations", "false"); settings->setDefault("node_highlighting", "box"); settings->setDefault("crosshair_color", "(255,255,255)"); settings->setDefault("crosshair_alpha", "255"); @@ -150,20 +149,28 @@ void set_default_settings(Settings *settings) settings->setDefault("gui_scaling", "1.0"); settings->setDefault("gui_scaling_filter", "false"); settings->setDefault("gui_scaling_filter_txr2img", "true"); - settings->setDefault("mouse_sensitivity", "0.2"); - settings->setDefault("enable_sound", "true"); - settings->setDefault("sound_volume", "0.8"); settings->setDefault("desynchronize_mapblock_texture_animation", "true"); settings->setDefault("hud_hotbar_max_width", "1.0"); settings->setDefault("enable_local_map_saving", "false"); settings->setDefault("show_entity_selectionbox", "true"); + settings->setDefault("texture_clean_transparent", "false"); + settings->setDefault("texture_min_size", "64"); + settings->setDefault("ambient_occlusion_gamma", "2.2"); + settings->setDefault("enable_shaders", "true"); + settings->setDefault("enable_particles", "true"); + settings->setDefault("enable_minimap", "true"); + settings->setDefault("minimap_shape_round", "true"); + settings->setDefault("minimap_double_scan_height", "true"); + + // Effects + settings->setDefault("directional_colored_fog", "true"); + settings->setDefault("view_bobbing", "true"); + settings->setDefault("inventory_items_animations", "false"); settings->setDefault("mip_map", "false"); settings->setDefault("anisotropic_filter", "false"); settings->setDefault("bilinear_filter", "false"); settings->setDefault("trilinear_filter", "false"); - settings->setDefault("texture_clean_transparent", "false"); - settings->setDefault("texture_min_size", "64"); settings->setDefault("tone_mapping", "false"); settings->setDefault("enable_bumpmapping", "false"); settings->setDefault("enable_parallax_occlusion", "false"); @@ -180,35 +187,29 @@ void set_default_settings(Settings *settings) settings->setDefault("water_wave_speed", "5.0"); settings->setDefault("enable_waving_leaves", "false"); settings->setDefault("enable_waving_plants", "false"); - settings->setDefault("ambient_occlusion_gamma", "2.2"); - settings->setDefault("enable_shaders", "true"); + + + // Input + settings->setDefault("invert_mouse", "false"); + settings->setDefault("mouse_sensitivity", "0.2"); settings->setDefault("repeat_rightclick_time", "0.25"); - settings->setDefault("enable_particles", "true"); - settings->setDefault("enable_mesh_cache", "false"); - settings->setDefault("enable_vbo", "true"); + settings->setDefault("random_input", "false"); + settings->setDefault("aux1_descends", "false"); + settings->setDefault("doubletap_jump", "false"); + settings->setDefault("always_fly_fast", "true"); + settings->setDefault("continuous_forward", "false"); + settings->setDefault("enable_joysticks", "false"); + settings->setDefault("repeat_joystick_button_time", "0.17"); + settings->setDefault("joystick_frustum_sensitivity", "170"); - settings->setDefault("enable_minimap", "true"); - settings->setDefault("minimap_shape_round", "true"); - settings->setDefault("minimap_double_scan_height", "true"); - - settings->setDefault("send_pre_v25_init", "false"); - - settings->setDefault("curl_timeout", "5000"); - settings->setDefault("curl_parallel_limit", "8"); - settings->setDefault("curl_file_download_timeout", "300000"); - settings->setDefault("curl_verify_cert", "true"); - - settings->setDefault("enable_remote_media_server", "true"); - - settings->setDefault("serverlist_url", "servers.minetest.net"); + // Main menu + settings->setDefault("main_menu_path", ""); + settings->setDefault("main_menu_mod_mgr", "1"); + settings->setDefault("main_menu_game_mgr", "0"); + settings->setDefault("modstore_download_url", "https://forum.minetest.net/media/"); + settings->setDefault("modstore_listmods_url", "https://forum.minetest.net/mmdb/mods/"); + settings->setDefault("modstore_details_url", "https://forum.minetest.net/mmdb/mod/*/"); settings->setDefault("serverlist_file", "favoriteservers.txt"); - settings->setDefault("server_announce", "false"); - settings->setDefault("server_url", ""); - settings->setDefault("server_address", ""); - settings->setDefault("server_name", ""); - settings->setDefault("server_description", ""); - - settings->setDefault("disable_escape_sequences", "false"); #if USE_FREETYPE settings->setDefault("freetype", "true"); @@ -221,41 +222,43 @@ void set_default_settings(Settings *settings) settings->setDefault("fallback_font_shadow", "1"); settings->setDefault("fallback_font_shadow_alpha", "128"); - std::stringstream fontsize; - fontsize << TTF_DEFAULT_FONT_SIZE; + std::string font_size_str = std::to_string(TTF_DEFAULT_FONT_SIZE); - settings->setDefault("font_size", fontsize.str()); - settings->setDefault("mono_font_size", fontsize.str()); - settings->setDefault("fallback_font_size", fontsize.str()); + settings->setDefault("fallback_font_size", font_size_str); #else settings->setDefault("freetype", "false"); settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "lucida_sans")); settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); - std::stringstream fontsize; - fontsize << DEFAULT_FONT_SIZE; - - settings->setDefault("font_size", fontsize.str()); - settings->setDefault("mono_font_size", fontsize.str()); + std::string font_size_str = to_string(DEFAULT_FONT_SIZE); #endif + settings->setDefault("font_size", font_size_str); + settings->setDefault("mono_font_size", font_size_str); - // Server stuff - // "map-dir" doesn't exist by default. + + // Server + settings->setDefault("disable_escape_sequences", "false"); + + // Network + settings->setDefault("enable_ipv6", "true"); + settings->setDefault("ipv6_server", "false"); settings->setDefault("workaround_window_size","5"); settings->setDefault("max_packets_per_iteration","1024"); settings->setDefault("port", "30000"); - settings->setDefault("bind_address", ""); + settings->setDefault("strict_protocol_version_checking", "false"); + settings->setDefault("player_transfer_distance", "0"); + settings->setDefault("max_simultaneous_block_sends_per_client", "10"); + settings->setDefault("max_simultaneous_block_sends_server_total", "40"); + settings->setDefault("time_send_interval", "5"); + settings->setDefault("default_game", "minetest"); settings->setDefault("motd", ""); settings->setDefault("max_users", "15"); - settings->setDefault("strict_protocol_version_checking", "false"); settings->setDefault("creative_mode", "false"); settings->setDefault("enable_damage", "true"); - settings->setDefault("fixed_map_seed", ""); settings->setDefault("give_initial_stuff", "false"); settings->setDefault("default_password", ""); settings->setDefault("default_privs", "interact, shout"); - settings->setDefault("player_transfer_distance", "0"); settings->setDefault("enable_pvp", "true"); settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disable_anticheat", "false"); @@ -271,18 +274,13 @@ void set_default_settings(Settings *settings) settings->setDefault("ask_reconnect_on_crash", "false"); settings->setDefault("profiler_print_interval", "0"); - settings->setDefault("enable_mapgen_debug_info", "false"); settings->setDefault("active_object_send_range_blocks", "3"); settings->setDefault("active_block_range", "3"); //settings->setDefault("max_simultaneous_block_sends_per_client", "1"); // This causes frametime jitter on client side, or does it? - settings->setDefault("max_simultaneous_block_sends_per_client", "10"); - settings->setDefault("max_simultaneous_block_sends_server_total", "40"); settings->setDefault("max_block_send_distance", "9"); - settings->setDefault("max_block_generate_distance", "7"); settings->setDefault("block_send_optimize_distance", "4"); settings->setDefault("max_clearobjects_extra_loaded_blocks", "4096"); - settings->setDefault("time_send_interval", "5"); settings->setDefault("time_speed", "72"); settings->setDefault("server_unload_unused_data_timeout", "29"); settings->setDefault("max_objects_per_block", "64"); @@ -307,7 +305,7 @@ void set_default_settings(Settings *settings) settings->setDefault("secure.trusted_mods", ""); settings->setDefault("secure.http_mods", ""); - // physics stuff + // Physics settings->setDefault("movement_acceleration_default", "3"); settings->setDefault("movement_acceleration_air", "2"); settings->setDefault("movement_acceleration_fast", "10"); @@ -321,32 +319,30 @@ void set_default_settings(Settings *settings) settings->setDefault("movement_liquid_sink", "10"); settings->setDefault("movement_gravity", "9.81"); - //liquid stuff + // Liquids settings->setDefault("liquid_loop_max", "100000"); settings->setDefault("liquid_queue_purge_time", "0"); settings->setDefault("liquid_update", "1.0"); - //mapgen stuff + // Mapgen settings->setDefault("mg_name", "v7"); settings->setDefault("water_level", "1"); settings->setDefault("chunksize", "5"); settings->setDefault("mg_flags", "dungeons"); + settings->setDefault("fixed_map_seed", ""); + settings->setDefault("map_generation_limit", "31000"); + settings->setDefault("max_block_generate_distance", "7"); + settings->setDefault("enable_mapgen_debug_info", "false"); - // IPv6 - settings->setDefault("enable_ipv6", "true"); - settings->setDefault("ipv6_server", "false"); - - settings->setDefault("main_menu_path", ""); - settings->setDefault("main_menu_mod_mgr", "1"); - settings->setDefault("main_menu_game_mgr", "0"); - settings->setDefault("modstore_download_url", "https://forum.minetest.net/media/"); - settings->setDefault("modstore_listmods_url", "https://forum.minetest.net/mmdb/mods/"); - settings->setDefault("modstore_details_url", "https://forum.minetest.net/mmdb/mod/*/"); + // Server list announcing + settings->setDefault("server_announce", "false"); + settings->setDefault("server_url", ""); + settings->setDefault("server_address", ""); + settings->setDefault("server_name", ""); + settings->setDefault("server_description", ""); settings->setDefault("high_precision_fpu", "true"); - settings->setDefault("language", ""); - #ifdef __ANDROID__ settings->setDefault("screenW", "0"); settings->setDefault("screenH", "0"); @@ -375,13 +371,12 @@ void set_default_settings(Settings *settings) settings->setDefault("viewing_range", "25"); settings->setDefault("inventory_image_hack", "false"); - //check for device with small screen + // Check for a device with a small screen float x_inches = ((double) porting::getDisplaySize().X / (160 * porting::getDisplayDensity())); if (x_inches < 3.5) { settings->setDefault("hud_scaling", "0.6"); - } - else if (x_inches < 4.5) { + } else if (x_inches < 4.5) { settings->setDefault("hud_scaling", "0.7"); } settings->setDefault("curl_verify_cert","false"); @@ -393,7 +388,7 @@ void set_default_settings(Settings *settings) void override_default_settings(Settings *settings, Settings *from) { std::vector names = from->getNames(); - for(size_t i=0; isetDefault(name, from->get(name)); } From ee6d8c10ce3f7570a47c6042c36da3c8566364a7 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sat, 14 Jan 2017 12:03:50 +0100 Subject: [PATCH 054/586] Fix missing const in ServerActiveObject::getStaticData This fixes #5033 Signed-off-by: Loic Blot --- src/serverobject.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serverobject.h b/src/serverobject.h index 26c8b062d..38204980e 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -119,7 +119,7 @@ public: when it is created (converted from static to active - actually the data is the static form) */ - virtual void getStaticData(std::string *result) + virtual void getStaticData(std::string *result) const { assert(isStaticAllowed()); *result = ""; From ee9b59a7fe9a3277ffdd26d29e66ef7a285df5ce Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sat, 14 Jan 2017 12:20:59 +0100 Subject: [PATCH 055/586] Fix another missing const reported by clang & @sfan5 Signed-off-by: Loic Blot --- src/content_cao.cpp | 2 +- src/content_cao.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 5ddbd27c9..83756c963 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -604,7 +604,7 @@ bool GenericCAO::getCollisionBox(aabb3f *toset) const return false; } -bool GenericCAO::collideWithObjects() +bool GenericCAO::collideWithObjects() const { return m_prop.collideWithObjects; } diff --git a/src/content_cao.h b/src/content_cao.h index 19fecdde5..846e0690a 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -132,7 +132,7 @@ public: bool getCollisionBox(aabb3f *toset) const; - bool collideWithObjects(); + bool collideWithObjects() const; aabb3f *getSelectionBox(); From f0c6feca97ee412b26c96521724dcd63104185bd Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 14 Jan 2017 12:28:43 +0100 Subject: [PATCH 056/586] Fix build with freetype support disabled --- src/defaultsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 14a88b7a6..59cfdd50d 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -230,7 +230,7 @@ void set_default_settings(Settings *settings) settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "lucida_sans")); settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); - std::string font_size_str = to_string(DEFAULT_FONT_SIZE); + std::string font_size_str = std::to_string(DEFAULT_FONT_SIZE); #endif settings->setDefault("font_size", font_size_str); settings->setDefault("mono_font_size", font_size_str); From c41352a1c7a393299ea0dce0b4d075849f96dcd9 Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Sat, 14 Jan 2017 13:30:14 -0800 Subject: [PATCH 057/586] Only set material flag on rendered meshes (#5023) --- src/clientmap.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 7e688daad..fa326f0b4 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -371,10 +371,10 @@ struct MeshBufListList void add(scene::IMeshBuffer *buf) { + const video::SMaterial &m = buf->getMaterial(); for(std::vector::iterator i = lists.begin(); i != lists.end(); ++i){ MeshBufList &l = *i; - video::SMaterial &m = buf->getMaterial(); // comparing a full material is quite expensive so we don't do it if // not even first texture is equal @@ -387,7 +387,7 @@ struct MeshBufListList } } MeshBufList l; - l.m = buf->getMaterial(); + l.m = m; l.bufs.push_back(buf); lists.push_back(l); } @@ -508,12 +508,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) { scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); - buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, m_cache_trilinear_filter); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, m_cache_bilinear_filter); - buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, m_cache_anistropic_filter); - buf->getMaterial().setFlag(video::EMF_WIREFRAME, m_control.show_wireframe); - - const video::SMaterial& material = buf->getMaterial(); + video::SMaterial& material = buf->getMaterial(); video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType); bool transparent = (rnd && rnd->isTransparent()); @@ -521,6 +516,12 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) if (buf->getVertexCount() == 0) errorstream << "Block [" << analyze_block(block) << "] contains an empty meshbuf" << std::endl; + + material.setFlag(video::EMF_TRILINEAR_FILTER, m_cache_trilinear_filter); + material.setFlag(video::EMF_BILINEAR_FILTER, m_cache_bilinear_filter); + material.setFlag(video::EMF_ANISOTROPIC_FILTER, m_cache_anistropic_filter); + material.setFlag(video::EMF_WIREFRAME, m_control.show_wireframe); + drawbufs.add(buf); } } From d03b4fb627b51fd794033452cfa3af77e879d0b5 Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 14 Jan 2017 22:30:03 +0100 Subject: [PATCH 058/586] Add color names from web page referenced in luaapi doc --- src/util/string.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util/string.cpp b/src/util/string.cpp index 94064ef93..141068512 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -561,6 +561,7 @@ ColorContainer::ColorContainer() colors["darkgoldenrod"] = 0xb8860b; colors["darkgray"] = 0xa9a9a9; colors["darkgreen"] = 0x006400; + colors["darkgrey"] = 0xa9a9a9; colors["darkkhaki"] = 0xbdb76b; colors["darkmagenta"] = 0x8b008b; colors["darkolivegreen"] = 0x556b2f; @@ -571,11 +572,13 @@ ColorContainer::ColorContainer() colors["darkseagreen"] = 0x8fbc8f; colors["darkslateblue"] = 0x483d8b; colors["darkslategray"] = 0x2f4f4f; + colors["darkslategrey"] = 0x2f4f4f; colors["darkturquoise"] = 0x00ced1; colors["darkviolet"] = 0x9400d3; colors["deeppink"] = 0xff1493; colors["deepskyblue"] = 0x00bfff; colors["dimgray"] = 0x696969; + colors["dimgrey"] = 0x696969; colors["dodgerblue"] = 0x1e90ff; colors["firebrick"] = 0xb22222; colors["floralwhite"] = 0xfffaf0; @@ -588,6 +591,7 @@ ColorContainer::ColorContainer() colors["gray"] = 0x808080; colors["green"] = 0x008000; colors["greenyellow"] = 0xadff2f; + colors["grey"] = 0x808080; colors["honeydew"] = 0xf0fff0; colors["hotpink"] = 0xff69b4; colors["indianred"] = 0xcd5c5c; @@ -604,11 +608,13 @@ ColorContainer::ColorContainer() colors["lightgoldenrodyellow"] = 0xfafad2; colors["lightgray"] = 0xd3d3d3; colors["lightgreen"] = 0x90ee90; + colors["lightgrey"] = 0xd3d3d3; colors["lightpink"] = 0xffb6c1; colors["lightsalmon"] = 0xffa07a; colors["lightseagreen"] = 0x20b2aa; colors["lightskyblue"] = 0x87cefa; colors["lightslategray"] = 0x778899; + colors["lightslategrey"] = 0x778899; colors["lightsteelblue"] = 0xb0c4de; colors["lightyellow"] = 0xffffe0; colors["lime"] = 0x00ff00; @@ -661,6 +667,7 @@ ColorContainer::ColorContainer() colors["skyblue"] = 0x87ceeb; colors["slateblue"] = 0x6a5acd; colors["slategray"] = 0x708090; + colors["slategrey"] = 0x708090; colors["snow"] = 0xfffafa; colors["springgreen"] = 0x00ff7f; colors["steelblue"] = 0x4682b4; From e12019cfd9ff4e9afa1d7dd326a0094b15fb9b2b Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 15 Jan 2017 01:21:36 +0000 Subject: [PATCH 059/586] Documentation: Correct biome heat / humidity noise parameters When the new set of biomes was added in MTGame the 'spread' for heat and humidity noise parameters was increased to 1000, i forgot to update settingtypes.txt and minetest.conf. --- builtin/settingtypes.txt | 4 ++-- minetest.conf.example | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 779224be4..2dfe86e04 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -910,9 +910,9 @@ emergequeue_limit_generate (Limit of emerge queues to generate) int 32 num_emerge_threads (Number of emerge threads) int 1 # Noise parameters for biome API temperature, humidity and biome blend. -mg_biome_np_heat (Mapgen biome heat noise parameters) noise_params 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0 +mg_biome_np_heat (Mapgen biome heat noise parameters) noise_params 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0 mg_biome_np_heat_blend (Mapgen heat blend noise parameters) noise_params 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0 -mg_biome_np_humidity (Mapgen biome humidity noise parameters) noise_params 50, 50, (750, 750, 750), 842, 3, 0.5, 2.0 +mg_biome_np_humidity (Mapgen biome humidity noise parameters) noise_params 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0 mg_biome_np_humidity_blend (Mapgen biome humidity blend noise parameters) noise_params 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0 [***Mapgen v5] diff --git a/minetest.conf.example b/minetest.conf.example index 13b2dc7a7..3b686aa61 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1131,13 +1131,13 @@ # Noise parameters for biome API temperature, humidity and biome blend. # type: noise_params -# mg_biome_np_heat = 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0 +# mg_biome_np_heat = 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0 # type: noise_params # mg_biome_np_heat_blend = 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0 # type: noise_params -# mg_biome_np_humidity = 50, 50, (750, 750, 750), 842, 3, 0.5, 2.0 +# mg_biome_np_humidity = 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0 # type: noise_params # mg_biome_np_humidity_blend = 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0 From f5070b44542edba97a20445c3774c221077cc4a2 Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 15 Jan 2017 13:36:53 +0100 Subject: [PATCH 060/586] =?UTF-8?q?Added=20lua=20tracebacks=20to=20some=20?= =?UTF-8?q?errors=20where=20you=20have=20been=20blind=20to=20what=E2=80=A6?= =?UTF-8?q?=20(#5043)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added lua tracebacks to some errors where you have been blind to what actually went wrong --- src/emerge.cpp | 2 +- src/script/common/c_converter.cpp | 4 +++- src/script/cpp_api/s_env.cpp | 12 +++++++++--- src/server.cpp | 5 +++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/emerge.cpp b/src/emerge.cpp index 3f0a46010..1c9719c48 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -564,7 +564,7 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata, m_server->getScriptIface()->environment_OnGenerated( minp, maxp, m_mapgen->blockseed); } catch (LuaError &e) { - m_server->setAsyncFatalError("Lua: " + std::string(e.what())); + m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what())); } EMERGE_DBG_OUT("ended up with: " << analyze_block(block)); diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index f36298915..fc516d56a 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -26,15 +26,17 @@ extern "C" { #include "util/serialize.h" #include "util/string.h" #include "common/c_converter.h" +#include "common/c_internal.h" #include "constants.h" #define CHECK_TYPE(index, name, type) do { \ int t = lua_type(L, (index)); \ if (t != (type)) { \ + std::string traceback = script_get_backtrace(L); \ throw LuaError(std::string("Invalid ") + (name) + \ " (expected " + lua_typename(L, (type)) + \ - " got " + lua_typename(L, t) + ")."); \ + " got " + lua_typename(L, t) + ").\n" + traceback); \ } \ } while(0) #define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER) diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index 913d8539d..b1404bf22 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -54,7 +54,9 @@ void ScriptApiEnv::environment_Step(float dtime) try { runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); } catch (LuaError &e) { - getServer()->setAsyncFatalError(e.what()); + getServer()->setAsyncFatalError( + std::string("environment_Step: ") + e.what() + "\n" + + script_get_backtrace(L)); } } @@ -75,7 +77,9 @@ void ScriptApiEnv::player_event(ServerActiveObject *player, const std::string &t try { runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); } catch (LuaError &e) { - getServer()->setAsyncFatalError(e.what()); + getServer()->setAsyncFatalError( + std::string("player_event: ") + e.what() + "\n" + + script_get_backtrace(L) ); } } @@ -237,7 +241,9 @@ void ScriptApiEnv::on_emerge_area_completion( try { PCALL_RES(lua_pcall(L, 4, 0, error_handler)); } catch (LuaError &e) { - server->setAsyncFatalError(e.what()); + server->setAsyncFatalError( + std::string("on_emerge_area_completion: ") + e.what() + "\n" + + script_get_backtrace(L)); } lua_pop(L, 1); // Pop error handler diff --git a/src/server.cpp b/src/server.cpp index 7380d37c2..29dce5a4a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -107,7 +107,8 @@ void *ServerThread::run() } catch (con::ConnectionBindFailed &e) { m_server->setAsyncFatalError(e.what()); } catch (LuaError &e) { - m_server->setAsyncFatalError("Lua: " + std::string(e.what())); + m_server->setAsyncFatalError( + "ServerThread::run Lua: " + std::string(e.what())); } } @@ -487,7 +488,7 @@ void Server::step(float dtime) g_settings->get("kick_msg_crash"), g_settings->getBool("ask_reconnect_on_crash")); } - throw ServerError(async_err); + throw ServerError("AsyncErr: " + async_err); } } From f3bd4c405df6bce64b7a98789d825eeac9c279b2 Mon Sep 17 00:00:00 2001 From: red-001 Date: Fri, 6 Jan 2017 20:29:29 +0000 Subject: [PATCH 061/586] Add keyword based search to serverlist --- builtin/mainmenu/common.lua | 2 +- builtin/mainmenu/init.lua | 2 +- builtin/mainmenu/tab_credits.lua | 2 +- builtin/mainmenu/tab_multiplayer.lua | 116 +++++++++++++++++++++++--- builtin/mainmenu/tab_server.lua | 2 +- builtin/mainmenu/tab_settings.lua | 4 +- builtin/mainmenu/tab_simple_main.lua | 4 +- builtin/mainmenu/tab_singleplayer.lua | 4 +- 8 files changed, 113 insertions(+), 23 deletions(-) diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua index da3667828..5e3df0864 100644 --- a/builtin/mainmenu/common.lua +++ b/builtin/mainmenu/common.lua @@ -77,7 +77,7 @@ function order_favorite_list(list) end -------------------------------------------------------------------------------- -function render_favorite(spec, is_favorite) +function render_serverlist_row(spec, is_favorite) local text = "" if spec.name then text = text .. core.formspec_escape(spec.name:trim()) diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua index 7f0c1e386..1b527a053 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -128,7 +128,7 @@ local function init_globals() end -- Create main tabview - local tv_main = tabview_create("maintab", {x = 12, y = 5.2}, {x = 0, y = 0}) + local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0}) if PLATFORM == "Android" then tv_main:add(tabs.simple_main) diff --git a/builtin/mainmenu/tab_credits.lua b/builtin/mainmenu/tab_credits.lua index c2ad19183..80e03f84d 100644 --- a/builtin/mainmenu/tab_credits.lua +++ b/builtin/mainmenu/tab_credits.lua @@ -85,7 +85,7 @@ return { "label[0.5,3.5;http://minetest.net]" .. "tablecolumns[color;text]" .. "tableoptions[background=#00000000;highlight=#00000000;border=false]" .. - "table[3.5,-0.25;8.5,5.8;list_credits;" .. + "table[3.5,-0.25;8.5,6.05;list_credits;" .. "#FFFF00," .. fgettext("Core Developers") .. ",," .. table.concat(core_developers, ",,") .. ",,," .. "#FFFF00," .. fgettext("Active Contributors") .. ",," .. diff --git a/builtin/mainmenu/tab_multiplayer.lua b/builtin/mainmenu/tab_multiplayer.lua index 00150f26d..3c2b2cdbe 100644 --- a/builtin/mainmenu/tab_multiplayer.lua +++ b/builtin/mainmenu/tab_multiplayer.lua @@ -20,7 +20,16 @@ local function get_formspec(tabview, name, tabdata) -- Update the cached supported proto info, -- it may have changed after a change by the settings menu. common_update_cached_supp_proto() - local fav_selected = menudata.favorites[tabdata.fav_selected] + local fav_selected = nil + if menudata.search_result then + fav_selected = menudata.search_result[tabdata.fav_selected] + else + fav_selected = menudata.favorites[tabdata.fav_selected] + end + + if not tabdata.search_for then + tabdata.search_for = "" + end local retval = "label[7.75,-0.15;" .. fgettext("Address / Port") .. "]" .. @@ -33,7 +42,9 @@ local function get_formspec(tabview, name, tabdata) "field[8,1.95;2.95,0.5;te_name;;" .. core.formspec_escape(core.setting_get("name")) .. "]" .. "pwdfield[10.78,1.95;1.77,0.5;te_pwd;]" .. - "box[7.73,2.35;4.3,2.28;#999999]" + "box[7.73,2.35;4.3,2.28;#999999]".. + "field[0.15,0.25;4.5,0.27;te_search;;"..core.formspec_escape(tabdata.search_for).."]".. + "button[4.8,0;2.7,0.1;btn_mp_search;" .. fgettext("Search") .. "]" if tabdata.fav_selected and fav_selected then if gamedata.fav then @@ -58,9 +69,27 @@ local function get_formspec(tabview, name, tabdata) image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. "color,span=1;" .. "text,padding=1]" .. - "table[-0.15,-0.1;7.75,5.5;favourites;" + "table[-0.15,0.4;7.75,5.35;favourites;" - if #menudata.favorites > 0 then + if menudata.search_result then + for i = 1, #menudata.search_result do + local favs = core.get_favorites("local") + local server = menudata.search_result[i] + + for fav_id = 1, #favs do + if server.address == favs[fav_id].address and + server.port == favs[fav_id].port then + server.is_favorite = true + end + end + + if i ~= 1 then + retval = retval .. "," + end + + retval = retval .. render_serverlist_row(server, server.is_favorite) + end + elseif #menudata.favorites > 0 then local favs = core.get_favorites("local") if #favs > 0 then for i = 1, #favs do @@ -75,9 +104,9 @@ local function get_formspec(tabview, name, tabdata) end end end - retval = retval .. render_favorite(menudata.favorites[1], (#favs > 0)) + retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) for i = 2, #menudata.favorites do - retval = retval .. "," .. render_favorite(menudata.favorites[i], (i <= #favs)) + retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end @@ -92,6 +121,8 @@ end -------------------------------------------------------------------------------- local function main_button_handler(tabview, fields, name, tabdata) + local serverlist = menudata.search_result or menudata.favorites + if fields.te_name then gamedata.playername = fields.te_name core.setting_set("name", fields.te_name) @@ -99,10 +130,10 @@ local function main_button_handler(tabview, fields, name, tabdata) if fields.favourites then local event = core.explode_table_event(fields.favourites) - local fav = menudata.favorites[event.row] + local fav = serverlist[event.row] if event.type == "DCL" then - if event.row <= #menudata.favorites then + if event.row <= #serverlist then if menudata.favorites_is_public and not is_server_protocol_compat_or_error( fav.proto_min, fav.proto_max) then @@ -131,7 +162,7 @@ local function main_button_handler(tabview, fields, name, tabdata) end if event.type == "CHG" then - if event.row <= #menudata.favorites then + if event.row <= #serverlist then gamedata.fav = false local favs = core.get_favorites("local") local address = fav.address @@ -157,7 +188,7 @@ local function main_button_handler(tabview, fields, name, tabdata) if fields.key_up or fields.key_down then local fav_idx = core.get_table_index("favourites") - local fav = menudata.favorites[fav_idx] + local fav = serverlist[fav_idx] if fav_idx then if fields.key_up and fav_idx > 1 then @@ -176,7 +207,7 @@ local function main_button_handler(tabview, fields, name, tabdata) local address = fav.address local port = fav.port - + gamedata.serverdescription = fav.description if address and port then core.setting_set("address", address) core.setting_set("remote_port", port) @@ -199,6 +230,65 @@ local function main_button_handler(tabview, fields, name, tabdata) return true end + if fields.btn_mp_search or fields.key_enter_field == "te_search" then + tabdata.fav_selected = 1 + local input = fields.te_search:lower() + tabdata.search_for = fields.te_search + + if #menudata.favorites < 2 then + return true + end + + menudata.search_result = {} + + -- setup the keyword list + local keywords = {} + for word in input:gmatch("%S+") do + table.insert(keywords, word) + end + + if #keywords == 0 then + menudata.search_result = nil + return true + end + + -- Search the serverlist + local search_result = {} + for i = 1, #menudata.favorites do + local server = menudata.favorites[i] + local found = 0 + for k = 1, #keywords do + local keyword = keywords[k] + if server.name then + local name = server.name:lower() + local _, count = name:gsub(keyword, keyword) + found = found + count * 4 + end + + if server.description then + local desc = server.description:lower() + local _, count = desc:gsub(keyword, keyword) + found = found + count * 2 + end + end + if found > 0 then + local points = (#menudata.favorites - i) / 5 + found + server.points = points + table.insert(search_result, server) + end + end + if #search_result > 0 then + table.sort(search_result, function(a, b) + return a.points > b.points + end) + menudata.search_result = search_result + local first_server = search_result[1] + core.setting_set("address", first_server.address) + core.setting_set("remote_port", first_server.port) + end + return true + end + if (fields.btn_mp_connect or fields.key_enter) and fields.te_address and fields.te_port then gamedata.playername = fields.te_name gamedata.password = fields.te_pwd @@ -206,9 +296,9 @@ local function main_button_handler(tabview, fields, name, tabdata) gamedata.port = fields.te_port gamedata.selected_world = 0 local fav_idx = core.get_table_index("favourites") - local fav = menudata.favorites[fav_idx] + local fav = serverlist[fav_idx] - if fav_idx and fav_idx <= #menudata.favorites and + if fav_idx and fav_idx <= #serverlist and fav.address == fields.te_address and fav.port == fields.te_port then diff --git a/builtin/mainmenu/tab_server.lua b/builtin/mainmenu/tab_server.lua index 6b96825a0..be57ad7ef 100644 --- a/builtin/mainmenu/tab_server.lua +++ b/builtin/mainmenu/tab_server.lua @@ -26,7 +26,7 @@ local function get_formspec(tabview, name, tabdata) "button[4,4.15;2.6,0.5;world_delete;" .. fgettext("Delete") .. "]" .. "button[6.5,4.15;2.8,0.5;world_create;" .. fgettext("New") .. "]" .. "button[9.2,4.15;2.55,0.5;world_configure;" .. fgettext("Configure") .. "]" .. - "button[8.5,4.95;3.25,0.5;start_server;" .. fgettext("Start Game") .. "]" .. + "button[8.5,5;3.25,0.5;start_server;" .. fgettext("Start Game") .. "]" .. "label[4,-0.25;" .. fgettext("Select World:") .. "]" .. "checkbox[0.25,0.25;cb_creative_mode;" .. fgettext("Creative Mode") .. ";" .. dump(core.setting_getbool("creative_mode")) .. "]" .. diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index af8df0ccb..e59572a41 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -209,12 +209,12 @@ local function formspec(tabview, name, tabdata) .. fgettext("Reset singleplayer world") .. "]" else tab_string = tab_string .. - "button[8,4.75;3.75,0.5;btn_change_keys;" + "button[8,4.85;3.75,0.5;btn_change_keys;" .. fgettext("Change keys") .. "]" end tab_string = tab_string .. - "button[0,4.75;3.75,0.5;btn_advanced_settings;" + "button[0,4.85;3.75,0.5;btn_advanced_settings;" .. fgettext("Advanced Settings") .. "]" diff --git a/builtin/mainmenu/tab_simple_main.lua b/builtin/mainmenu/tab_simple_main.lua index 3818f321f..a773a4912 100644 --- a/builtin/mainmenu/tab_simple_main.lua +++ b/builtin/mainmenu/tab_simple_main.lua @@ -70,9 +70,9 @@ local function get_formspec(tabview, name, tabdata) end end end - retval = retval .. render_favorite(menudata.favorites[1], (#favs > 0)) + retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) for i = 2, #menudata.favorites do - retval = retval .. "," .. render_favorite(menudata.favorites[i], (i <= #favs)) + retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end diff --git a/builtin/mainmenu/tab_singleplayer.lua b/builtin/mainmenu/tab_singleplayer.lua index 05060cbc6..236de763c 100644 --- a/builtin/mainmenu/tab_singleplayer.lua +++ b/builtin/mainmenu/tab_singleplayer.lua @@ -57,7 +57,7 @@ local function singleplayer_refresh_gamebar() local btnbar = buttonbar_create("game_button_bar", game_buttonbar_button_handler, - {x=-0.3,y=5.65}, "horizontal", {x=12.4,y=1.15}) + {x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15}) for i=1,#gamemgr.games,1 do local btn_name = "game_btnbar_" .. gamemgr.games[i].id @@ -96,7 +96,7 @@ local function get_formspec(tabview, name, tabdata) "button[4,4.15;2.6,0.5;world_delete;".. fgettext("Delete") .. "]" .. "button[6.5,4.15;2.8,0.5;world_create;".. fgettext("New") .. "]" .. "button[9.2,4.15;2.55,0.5;world_configure;".. fgettext("Configure") .. "]" .. - "button[8.5,4.95;3.25,0.5;play;".. fgettext("Play") .. "]" .. + "button[8.5,5;3.25,0.5;play;".. fgettext("Play") .. "]" .. "label[4,-0.25;".. fgettext("Select World:") .. "]".. "checkbox[0.25,0.25;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. dump(core.setting_getbool("creative_mode")) .. "]".. From 63c892eedfe21cbca2e2369d28e5e4d4e62ca1bd Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 16 Jan 2017 13:08:59 +0000 Subject: [PATCH 062/586] Rename ObjectRef methods to be consistent and predictable --- doc/lua_api.txt | 22 +++++------ src/script/lua_api/l_internal.h | 1 + src/script/lua_api/l_object.cpp | 66 ++++++++++++++++----------------- src/script/lua_api/l_object.h | 44 +++++++++++----------- 4 files changed, 67 insertions(+), 66 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index fc0f8e1fc..da6a898d9 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2788,9 +2788,9 @@ This is basically a reference to a C++ `ServerActiveObject` #### Methods * `remove()`: remove object (after returning from Lua) * Note: Doesn't work on players, use minetest.kick_player instead -* `getpos()`: returns `{x=num, y=num, z=num}` -* `setpos(pos)`; `pos`=`{x=num, y=num, z=num}` -* `moveto(pos, continuous=false)`: interpolated move +* `get_pos()`: returns `{x=num, y=num, z=num}` +* `set_pos(pos)`; `pos`=`{x=num, y=num, z=num}` +* `move_to(pos, continuous=false)`: interpolated move * `punch(puncher, time_from_last_punch, tool_capabilities, direction)` * `puncher` = another `ObjectRef`, * `time_from_last_punch` = time since last punch action of the puncher @@ -2836,14 +2836,14 @@ This is basically a reference to a C++ `ServerActiveObject` } ##### LuaEntitySAO-only (no-op for other objects) -* `setvelocity({x=num, y=num, z=num})` -* `getvelocity()`: returns `{x=num, y=num, z=num}` -* `setacceleration({x=num, y=num, z=num})` -* `getacceleration()`: returns `{x=num, y=num, z=num}` -* `setyaw(radians)` -* `getyaw()`: returns number in radians -* `settexturemod(mod)` -* `setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2, +* `set_velocity({x=num, y=num, z=num})` +* `get_velocity()`: returns `{x=num, y=num, z=num}` +* `set_acceleration({x=num, y=num, z=num})` +* `get_acceleration()`: returns `{x=num, y=num, z=num}` +* `set_yaw(radians)` +* `get_yaw()`: returns number in radians +* `set_texture_mod(mod)` +* `set_sprite(p={x=0,y=0}, num_frames=1, framelength=0.2, select_horiz_by_yawpitch=false)` * Select sprite from spritesheet with optional animation and DM-style texture selection based on yaw relative to camera diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index 456c8fcce..c610dc5a3 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_internal.h" #define luamethod(class, name) {#name, class::l_##name} +#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name} #define API_FCT(name) registerFunction(L, #name, l_##name,top) #define ASYNC_API_FCT(name) engine.registerFunction(#name, l_##name) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 506e56df9..dd29208c5 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -150,9 +150,9 @@ int ObjectRef::l_remove(lua_State *L) return 0; } -// getpos(self) +// get_pos(self) // returns: {x=num, y=num, z=num} -int ObjectRef::l_getpos(lua_State *L) +int ObjectRef::l_get_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -169,8 +169,8 @@ int ObjectRef::l_getpos(lua_State *L) return 1; } -// setpos(self, pos) -int ObjectRef::l_setpos(lua_State *L) +// set_pos(self, pos) +int ObjectRef::l_set_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -184,8 +184,8 @@ int ObjectRef::l_setpos(lua_State *L) return 0; } -// moveto(self, pos, continuous=false) -int ObjectRef::l_moveto(lua_State *L) +// move_to(self, pos, continuous=false) +int ObjectRef::l_move_to(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -821,8 +821,8 @@ int ObjectRef::l_get_nametag_attributes(lua_State *L) /* LuaEntitySAO-only */ -// setvelocity(self, {x=num, y=num, z=num}) -int ObjectRef::l_setvelocity(lua_State *L) +// set_velocity(self, {x=num, y=num, z=num}) +int ObjectRef::l_set_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -834,8 +834,8 @@ int ObjectRef::l_setvelocity(lua_State *L) return 0; } -// getvelocity(self) -int ObjectRef::l_getvelocity(lua_State *L) +// get_velocity(self) +int ObjectRef::l_get_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -847,8 +847,8 @@ int ObjectRef::l_getvelocity(lua_State *L) return 1; } -// setacceleration(self, {x=num, y=num, z=num}) -int ObjectRef::l_setacceleration(lua_State *L) +// set_acceleration(self, {x=num, y=num, z=num}) +int ObjectRef::l_set_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -861,8 +861,8 @@ int ObjectRef::l_setacceleration(lua_State *L) return 0; } -// getacceleration(self) -int ObjectRef::l_getacceleration(lua_State *L) +// get_acceleration(self) +int ObjectRef::l_get_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -874,8 +874,8 @@ int ObjectRef::l_getacceleration(lua_State *L) return 1; } -// setyaw(self, radians) -int ObjectRef::l_setyaw(lua_State *L) +// set_yaw(self, radians) +int ObjectRef::l_set_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -887,8 +887,8 @@ int ObjectRef::l_setyaw(lua_State *L) return 0; } -// getyaw(self) -int ObjectRef::l_getyaw(lua_State *L) +// get_yaw(self) +int ObjectRef::l_get_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -900,8 +900,8 @@ int ObjectRef::l_getyaw(lua_State *L) return 1; } -// settexturemod(self, mod) -int ObjectRef::l_settexturemod(lua_State *L) +// set_texture_mod(self, mod) +int ObjectRef::l_set_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -913,9 +913,9 @@ int ObjectRef::l_settexturemod(lua_State *L) return 0; } -// setsprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, +// set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) -int ObjectRef::l_setsprite(lua_State *L) +int ObjectRef::l_set_sprite(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); @@ -1774,9 +1774,9 @@ const char ObjectRef::className[] = "ObjectRef"; const luaL_reg ObjectRef::methods[] = { // ServerActiveObject luamethod(ObjectRef, remove), - luamethod(ObjectRef, getpos), - luamethod(ObjectRef, setpos), - luamethod(ObjectRef, moveto), + luamethod_aliased(ObjectRef, get_pos, getpos), + luamethod_aliased(ObjectRef, set_pos, setpos), + luamethod_aliased(ObjectRef, move_to, moveto), luamethod(ObjectRef, punch), luamethod(ObjectRef, right_click), luamethod(ObjectRef, set_hp), @@ -1800,14 +1800,14 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, set_nametag_attributes), luamethod(ObjectRef, get_nametag_attributes), // LuaEntitySAO-only - luamethod(ObjectRef, setvelocity), - luamethod(ObjectRef, getvelocity), - luamethod(ObjectRef, setacceleration), - luamethod(ObjectRef, getacceleration), - luamethod(ObjectRef, setyaw), - luamethod(ObjectRef, getyaw), - luamethod(ObjectRef, settexturemod), - luamethod(ObjectRef, setsprite), + luamethod_aliased(ObjectRef, set_velocity, setvelocity), + luamethod_aliased(ObjectRef, get_velocity, getvelocity), + luamethod_aliased(ObjectRef, set_acceleration, setacceleration), + luamethod_aliased(ObjectRef, get_acceleration, getacceleration), + luamethod_aliased(ObjectRef, set_yaw, setyaw), + luamethod_aliased(ObjectRef, get_yaw, getyaw), + luamethod_aliased(ObjectRef, set_texture_mod, set_texturemod), + luamethod_aliased(ObjectRef, set_sprite, setsprite), luamethod(ObjectRef, get_entity_name), luamethod(ObjectRef, get_luaentity), // Player-only diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 09f10e417..06b1bb79b 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -57,15 +57,15 @@ private: // remove(self) static int l_remove(lua_State *L); - // getpos(self) + // get_pos(self) // returns: {x=num, y=num, z=num} - static int l_getpos(lua_State *L); + static int l_get_pos(lua_State *L); - // setpos(self, pos) - static int l_setpos(lua_State *L); + // set_pos(self, pos) + static int l_set_pos(lua_State *L); - // moveto(self, pos, continuous=false) - static int l_moveto(lua_State *L); + // move_to(self, pos, continuous=false) + static int l_move_to(lua_State *L); // punch(self, puncher, time_from_last_punch, tool_capabilities, dir) static int l_punch(lua_State *L); @@ -143,30 +143,30 @@ private: /* LuaEntitySAO-only */ - // setvelocity(self, {x=num, y=num, z=num}) - static int l_setvelocity(lua_State *L); + // set_velocity(self, {x=num, y=num, z=num}) + static int l_set_velocity(lua_State *L); - // getvelocity(self) - static int l_getvelocity(lua_State *L); + // get_velocity(self) + static int l_get_velocity(lua_State *L); - // setacceleration(self, {x=num, y=num, z=num}) - static int l_setacceleration(lua_State *L); + // set_acceleration(self, {x=num, y=num, z=num}) + static int l_set_acceleration(lua_State *L); - // getacceleration(self) - static int l_getacceleration(lua_State *L); + // get_acceleration(self) + static int l_get_acceleration(lua_State *L); - // setyaw(self, radians) - static int l_setyaw(lua_State *L); + // set_yaw(self, radians) + static int l_set_yaw(lua_State *L); - // getyaw(self) - static int l_getyaw(lua_State *L); + // get_yaw(self) + static int l_get_yaw(lua_State *L); - // settexturemod(self, mod) - static int l_settexturemod(lua_State *L); + // set_texture_mod(self, mod) + static int l_set_texture_mod(lua_State *L); - // setsprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, + // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) - static int l_setsprite(lua_State *L); + static int l_set_sprite(lua_State *L); // DEPRECATED // get_entity_name(self) From d2f5732f89cd58dafc6a4f398b8ebfd122754852 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 16 Jan 2017 15:15:43 +0000 Subject: [PATCH 063/586] Adjust formspec spacing on the Client tab of the mainmenu --- builtin/mainmenu/tab_multiplayer.lua | 35 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/builtin/mainmenu/tab_multiplayer.lua b/builtin/mainmenu/tab_multiplayer.lua index 3c2b2cdbe..f8edeaddd 100644 --- a/builtin/mainmenu/tab_multiplayer.lua +++ b/builtin/mainmenu/tab_multiplayer.lua @@ -32,27 +32,36 @@ local function get_formspec(tabview, name, tabdata) end local retval = - "label[7.75,-0.15;" .. fgettext("Address / Port") .. "]" .. - "label[7.75,1.05;" .. fgettext("Name / Password") .. "]" .. - "field[8,0.75;3.3,0.5;te_address;;" .. + -- Search + "field[0.15,0.35;6.05,0.27;te_search;;"..core.formspec_escape(tabdata.search_for).."]".. + "button[5.8,0.1;2,0.1;btn_mp_search;" .. fgettext("Search") .. "]" .. + + -- Address / Port + "label[7.75,-0.25;" .. fgettext("Address / Port") .. "]" .. + "field[8,0.65;3.25,0.5;te_address;;" .. core.formspec_escape(core.setting_get("address")) .. "]" .. - "field[11.15,0.75;1.4,0.5;te_port;;" .. + "field[11.1,0.65;1.4,0.5;te_port;;" .. core.formspec_escape(core.setting_get("remote_port")) .. "]" .. - "button[10.1,4.9;2,0.5;btn_mp_connect;" .. fgettext("Connect") .. "]" .. - "field[8,1.95;2.95,0.5;te_name;;" .. + + -- Name / Password + "label[7.75,0.95;" .. fgettext("Name / Password") .. "]" .. + "field[8,1.85;2.9,0.5;te_name;;" .. core.formspec_escape(core.setting_get("name")) .. "]" .. - "pwdfield[10.78,1.95;1.77,0.5;te_pwd;]" .. - "box[7.73,2.35;4.3,2.28;#999999]".. - "field[0.15,0.25;4.5,0.27;te_search;;"..core.formspec_escape(tabdata.search_for).."]".. - "button[4.8,0;2.7,0.1;btn_mp_search;" .. fgettext("Search") .. "]" + "pwdfield[10.73,1.85;1.77,0.5;te_pwd;]" .. + + -- Description Background + "box[7.73,2.25;4.25,2.6;#999999]".. + + -- Connect + "button[10.1,5.15;2,0.5;btn_mp_connect;" .. fgettext("Connect") .. "]" if tabdata.fav_selected and fav_selected then if gamedata.fav then - retval = retval .. "button[7.85,4.9;2.3,0.5;btn_delete_favorite;" .. + retval = retval .. "button[7.75,5.15;2.3,0.5;btn_delete_favorite;" .. fgettext("Del. Favorite") .. "]" end if fav_selected.description then - retval = retval .. "textarea[8.1,2.4;4.26,2.6;;" .. + retval = retval .. "textarea[8.1,2.3;4.23,2.9;;" .. core.formspec_escape((gamedata.serverdescription or ""), true) .. ";]" end end @@ -69,7 +78,7 @@ local function get_formspec(tabview, name, tabdata) image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. "color,span=1;" .. "text,padding=1]" .. - "table[-0.15,0.4;7.75,5.35;favourites;" + "table[-0.15,0.6;7.75,5.15;favourites;" if menudata.search_result then for i = 1, #menudata.search_result do From 2f56a00d9eef82052614e5854a07b39b087efd0b Mon Sep 17 00:00:00 2001 From: red-001 Date: Mon, 16 Jan 2017 23:09:47 +0000 Subject: [PATCH 064/586] Remove client-side chat prediction. (#5055) Network lag isn't really a big issue with chat and chat prediction makes writing mods harder. --- builtin/game/features.lua | 1 + src/client.cpp | 11 +++++++---- src/network/networkprotocol.h | 1 + src/server.cpp | 8 ++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/builtin/game/features.lua b/builtin/game/features.lua index 646b254ea..ef85fbbc3 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -10,6 +10,7 @@ core.features = { texture_names_parens = true, area_store_custom_ids = true, add_entity_with_staticdata = true, + no_chat_message_prediction = true, } function core.has_feature(arg) diff --git a/src/client.cpp b/src/client.cpp index c2471dbd7..30058a2b0 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1563,10 +1563,13 @@ void Client::typeChatMessage(const std::wstring &message) } else { - LocalPlayer *player = m_env.getLocalPlayer(); - assert(player != NULL); - std::wstring name = narrow_to_wide(player->getName()); - m_chat_queue.push((std::wstring)L"<" + name + L"> " + message); + // compatibility code + if (m_proto_ver < 29) { + LocalPlayer *player = m_env.getLocalPlayer(); + assert(player != NULL); + std::wstring name = narrow_to_wide(player->getName()); + m_chat_queue.push((std::wstring)L"<" + name + L"> " + message); + } } } diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 45bf76ff8..23c8a665b 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -142,6 +142,7 @@ with this program; if not, write to the Free Software Foundation, Inc., Server doesn't accept TOSERVER_BREATH anymore serialization of TileAnimation params changed TAT_SHEET_2D + Removed client-sided chat perdiction */ #define LATEST_PROTOCOL_VERSION 29 diff --git a/src/server.cpp b/src/server.cpp index 29dce5a4a..74d9541c9 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2826,7 +2826,15 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna std::vector clients = m_clients.getClientIDs(); + /* + Send the message back to the inital sender + if they are using protocol version >= 29 + */ + u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT); + if (player->protocol_version >= 29) + peer_id_to_avoid_sending = PEER_ID_INEXISTENT; + for (u16 i = 0; i < clients.size(); i++) { u16 cid = clients[i]; if (cid != peer_id_to_avoid_sending) From d218baa3ace1f40813a346543feeac2aa71c480c Mon Sep 17 00:00:00 2001 From: Ezhh Date: Tue, 17 Jan 2017 14:41:25 +0000 Subject: [PATCH 065/586] Improve priv descriptions (#5047) --- builtin/game/chatcommands.lua | 41 ++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index eb6edc1c8..199b9e964 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -71,7 +71,8 @@ end -- core.register_chatcommand("me", { params = "", - description = "chat action (eg. /me orders a pizza)", + description = "Display chat action (e.g., '/me orders a pizza' displays" + .. " ' orders a pizza')", privs = {shout=true}, func = function(name, param) core.chat_send_all("* " .. name .. " " .. param) @@ -147,7 +148,7 @@ core.register_chatcommand("help", { core.register_chatcommand("privs", { params = "", - description = "print out privileges of player", + description = "Print privileges of player", func = function(caller, param) param = param:trim() local name = (param ~= "" and param or caller) @@ -270,7 +271,7 @@ core.register_chatcommand("revoke", { core.register_chatcommand("setpassword", { params = " ", - description = "set given password", + description = "Set player's password", privs = {password=true}, func = function(name, param) local toname, raw_password = string.match(param, "^([^ ]+) +(.+)$") @@ -308,7 +309,7 @@ core.register_chatcommand("setpassword", { core.register_chatcommand("clearpassword", { params = "", - description = "set empty password", + description = "Set empty password", privs = {password=true}, func = function(name, param) local toname = param @@ -325,7 +326,7 @@ core.register_chatcommand("clearpassword", { core.register_chatcommand("auth_reload", { params = "", - description = "reload authentication data", + description = "Reload authentication data", privs = {server=true}, func = function(name, param) local done = core.auth_reload() @@ -335,7 +336,7 @@ core.register_chatcommand("auth_reload", { core.register_chatcommand("teleport", { params = ",, | | ,, | ", - description = "teleport to given position", + description = "Teleport to player or position", privs = {teleport=true}, func = function(name, param) -- Returns (pos, true) if found, otherwise (pos, false) @@ -443,7 +444,7 @@ core.register_chatcommand("teleport", { core.register_chatcommand("set", { params = "[-n] | ", - description = "set or read server configuration setting", + description = "Set or read server configuration setting", privs = {server=true}, func = function(name, param) local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)") @@ -498,7 +499,7 @@ end core.register_chatcommand("emergeblocks", { params = "(here [radius]) | ( )", - description = "starts loading (or generating, if inexistent) map blocks " + description = "Load (or, if nonexistent, generate) map blocks " .. "contained in area pos1 to pos2", privs = {server=true}, func = function(name, param) @@ -524,7 +525,7 @@ core.register_chatcommand("emergeblocks", { core.register_chatcommand("deleteblocks", { params = "(here [radius]) | ( )", - description = "delete map blocks contained in area pos1 to pos2", + description = "Delete map blocks contained in area pos1 to pos2", privs = {server=true}, func = function(name, param) local p1, p2 = parse_range_str(name, param) @@ -588,7 +589,7 @@ end core.register_chatcommand("give", { params = " ", - description = "give item to player", + description = "Give item to player", privs = {give=true}, func = function(name, param) local toname, itemstring = string.match(param, "^([^ ]+) +(.+)$") @@ -601,7 +602,7 @@ core.register_chatcommand("give", { core.register_chatcommand("giveme", { params = "", - description = "give item to yourself", + description = "Give item to yourself", privs = {give=true}, func = function(name, param) local itemstring = string.match(param, "(.+)$") @@ -672,9 +673,9 @@ end) core.register_chatcommand("rollback_check", { params = "[] [] [limit]", - description = "Check who has last touched a node or near it," - .. " max. ago (default range=0," - .. " seconds=86400=24h, limit=5)", + description = "Check who last touched a node or a node near it" + .. " within the time specified by . Default: range = 0," + .. " seconds = 86400 = 24h, limit = 5", privs = {rollback=true}, func = function(name, param) if not core.setting_getbool("enable_rollback_recording") then @@ -725,7 +726,7 @@ core.register_chatcommand("rollback_check", { core.register_chatcommand("rollback", { params = " [] | : []", - description = "revert actions of a player; default for is 60", + description = "Revert actions of a player. Default for is 60", privs = {rollback=true}, func = function(name, param) if not core.setting_getbool("enable_rollback_recording") then @@ -770,7 +771,7 @@ core.register_chatcommand("status", { core.register_chatcommand("time", { params = "<0..23>:<0..59> | <0..24000>", - description = "set time of day", + description = "Set time of day", privs = {}, func = function(name, param) if param == "" then @@ -816,7 +817,7 @@ core.register_chatcommand("days", { }) core.register_chatcommand("shutdown", { - description = "shutdown server", + description = "Shutdown server", privs = {server=true}, func = function(name, param) core.log("action", name .. " shuts down server") @@ -847,7 +848,7 @@ core.register_chatcommand("ban", { core.register_chatcommand("unban", { params = "", - description = "remove IP ban", + description = "Remove IP ban", privs = {ban=true}, func = function(name, param) if not core.unban_player_or_ip(param) then @@ -860,7 +861,7 @@ core.register_chatcommand("unban", { core.register_chatcommand("kick", { params = " [reason]", - description = "kick a player", + description = "Kick a player", privs = {kick=true}, func = function(name, param) local tokick, reason = param:match("([^ ]+) (.+)") @@ -879,7 +880,7 @@ core.register_chatcommand("kick", { core.register_chatcommand("clearobjects", { params = "[full|quick]", - description = "clear all objects in world", + description = "Clear all objects in world", privs = {server=true}, func = function(name, param) local options = {} From 51746ca910f8bce0837a72110e47ec7de76d1c19 Mon Sep 17 00:00:00 2001 From: sapier Date: Tue, 17 Jan 2017 19:41:52 +0100 Subject: [PATCH 066/586] Fix typo in alias for deprecated settexturemod --- src/script/lua_api/l_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index dd29208c5..59c04f301 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1806,7 +1806,7 @@ const luaL_reg ObjectRef::methods[] = { luamethod_aliased(ObjectRef, get_acceleration, getacceleration), luamethod_aliased(ObjectRef, set_yaw, setyaw), luamethod_aliased(ObjectRef, get_yaw, getyaw), - luamethod_aliased(ObjectRef, set_texture_mod, set_texturemod), + luamethod_aliased(ObjectRef, set_texture_mod, settexturemod), luamethod_aliased(ObjectRef, set_sprite, setsprite), luamethod(ObjectRef, get_entity_name), luamethod(ObjectRef, get_luaentity), From a378e32751127e2ae3708a33f035d1dcf5d400a1 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 18 Jan 2017 06:48:25 +0000 Subject: [PATCH 067/586] Add search to advanced settings (#4806) * Add search to advanced settings * Press enter again to go to next result * Use keyword based search, auto select best option --- builtin/mainmenu/dlg_settings_advanced.lua | 120 +++++++++++++++++++-- 1 file changed, 114 insertions(+), 6 deletions(-) diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua index 60ec1250f..697babeb6 100644 --- a/builtin/mainmenu/dlg_settings_advanced.lua +++ b/builtin/mainmenu/dlg_settings_advanced.lua @@ -344,7 +344,82 @@ local function parse_config_file(read_all, parse_mods) return settings end -local settings = parse_config_file(false, true) +local function filter_settings(settings, searchstring) + if not searchstring or searchstring == "" then + return settings, -1 + end + + -- Setup the keyword list + local keywords = {} + for word in searchstring:lower():gmatch("%S+") do + table.insert(keywords, word) + end + + local result = {} + local category_stack = {} + local current_level = 0 + local best_setting = nil + for _, entry in pairs(settings) do + if entry.type == "category" then + -- Remove all settingless categories + while #category_stack > 0 and entry.level <= current_level do + table.remove(category_stack, #category_stack) + if #category_stack > 0 then + current_level = category_stack[#category_stack].level + else + current_level = 0 + end + end + + -- Push category onto stack + category_stack[#category_stack + 1] = entry + current_level = entry.level + else + -- See if setting matches keywords + local setting_score = 0 + for k = 1, #keywords do + local keyword = keywords[k] + + if string.find(entry.name:lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + + if entry.readable_name and + string.find(fgettext(entry.readable_name):lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + + if entry.comment and + string.find(fgettext_ne(entry.comment):lower(), keyword, 1, true) then + setting_score = setting_score + 1 + end + end + + -- Add setting to results if match + if setting_score > 0 then + -- Add parent categories + for _, category in pairs(category_stack) do + result[#result + 1] = category + end + category_stack = {} + + -- Add setting + result[#result + 1] = entry + entry.score = setting_score + + if not best_setting or + setting_score > result[best_setting].score then + best_setting = #result + end + end + end + end + return result, best_setting or -1 +end + +local full_settings = parse_config_file(false, true) +local search_string = "" +local settings = full_settings local selected_setting = 1 local function get_current_value(setting) @@ -546,7 +621,10 @@ local function create_settings_formspec(tabview, name, tabdata) local formspec = "size[12,6.5;true]" .. "tablecolumns[color;tree;text,width=32;text]" .. "tableoptions[background=#00000000;border=false]" .. - "table[0,0;12,5.5;list_settings;" + "field[0.3,0.1;10.2,1;search_string;;" .. core.formspec_escape(search_string) .. "]" .. + "field_close_on_enter[search_string;false]" .. + "button[10.2,-0.2;2,1;search;" .. fgettext("Search") .. "]" .. + "table[0,0.8;12,4.5;list_settings;" local current_level = 0 for _, entry in ipairs(settings) do @@ -597,10 +675,10 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) local list_enter = false if fields["list_settings"] then selected_setting = core.get_table_index("list_settings") - if core.explode_table_event(fields["list_settings"]).type == "DCL" then + if core.explode_table_event(fields["list_settings"]).type == "DCL" then -- Directly toggle booleans local setting = settings[selected_setting] - if setting.type == "bool" then + if setting and setting.type == "bool" then local current_value = get_current_value(setting) core.setting_setbool(setting.name, not core.is_yes(current_value)) core.setting_save() @@ -613,9 +691,39 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) end end + if fields.search or fields.key_enter_field == "search_string" then + if search_string == fields.search_string then + if selected_setting > 0 then + -- Go to next result on enter press + local i = selected_setting + 1 + local looped = false + while i > #settings or settings[i].type == "category" do + i = i + 1 + if i > #settings then + -- Stop infinte looping + if looped then + return false + end + i = 1 + looped = true + end + end + selected_setting = i + core.update_formspec(this:get_formspec()) + return true + end + else + -- Search for setting + search_string = fields.search_string + settings, selected_setting = filter_settings(full_settings, search_string) + core.update_formspec(this:get_formspec()) + end + return true + end + if fields["btn_edit"] or list_enter then local setting = settings[selected_setting] - if setting.type ~= "category" then + if setting and setting.type ~= "category" then local edit_dialog = dialog_create("change_setting", create_change_setting_formspec, handle_change_setting_buttons) edit_dialog:set_parent(this) @@ -627,7 +735,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) if fields["btn_restore"] then local setting = settings[selected_setting] - if setting.type ~= "category" then + if setting and setting.type ~= "category" then core.setting_set(setting.name, setting.default) core.setting_save() core.update_formspec(this:get_formspec()) From c5967f75f0a9827d1b65b384edd6ba07c73ffd2f Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 18 Jan 2017 10:19:57 +0000 Subject: [PATCH 068/586] Add minetest.player_exists() (#5064) --- builtin/game/misc.lua | 13 ++++++++----- doc/lua_api.txt | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 7caa9e7ba..3419c1980 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -56,11 +56,11 @@ function core.check_player_privs(name, ...) elseif arg_type ~= "string" then error("Invalid core.check_player_privs argument type: " .. arg_type, 2) end - + local requested_privs = {...} local player_privs = core.get_player_privs(name) local missing_privileges = {} - + if type(requested_privs[1]) == "table" then -- We were provided with a table like { privA = true, privB = true }. for priv, value in pairs(requested_privs[1]) do @@ -76,11 +76,11 @@ function core.check_player_privs(name, ...) end end end - + if #missing_privileges > 0 then return false, missing_privileges end - + return true, "" end @@ -114,6 +114,10 @@ function core.get_connected_players() return temp_table end +function minetest.player_exists(name) + return minetest.get_auth_handler().get_auth(name) ~= nil +end + -- Returns two position vectors representing a box of `radius` in each -- direction centered around the player corresponding to `player_name` function core.get_player_radius_area(player_name, radius) @@ -244,4 +248,3 @@ end function core.close_formspec(player_name, formname) return minetest.show_formspec(player_name, formname, "") end - diff --git a/doc/lua_api.txt b/doc/lua_api.txt index da6a898d9..c96131455 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2583,6 +2583,7 @@ These functions return the leftover itemstack. ### Misc. * `minetest.get_connected_players()`: returns list of `ObjectRefs` +* `minetest.player_exists(name)`: boolean, whether player exists (regardless of online status) * `minetest.hud_replace_builtin(name, hud_definition)` * Replaces definition of a builtin hud element * `name`: `"breath"` or `"health"` From 7279f0b37335396c85f6bdd7dc67ff56e53df0f9 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 14 Jan 2017 16:48:49 +0100 Subject: [PATCH 069/586] Add particle animation, glow This is implemented by reusing and extending the TileAnimation code for the methods used by particles. --- doc/lua_api.txt | 7 +- games/minimal/mods/experimental/init.lua | 37 +++++++++++ src/client.h | 5 ++ src/network/clientpackethandler.cpp | 18 +++++ src/network/networkpacket.cpp | 2 +- src/network/networkpacket.h | 5 +- src/nodedef.cpp | 2 +- src/particles.cpp | 74 +++++++++++++++++---- src/particles.h | 12 +++- src/script/common/c_content.cpp | 60 ++++++++++------- src/script/common/c_content.h | 1 + src/script/lua_api/l_particles.cpp | 27 +++++++- src/server.cpp | 85 +++++++++++++++++------- src/server.h | 18 +++-- src/tileanimation.cpp | 32 +++++++-- src/tileanimation.h | 4 +- 16 files changed, 311 insertions(+), 78 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c96131455..9bdc01c07 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -4180,10 +4180,15 @@ The Biome API is still in an experimental phase and subject to change. -- ^ vertical: if true faces player using y axis only texture = "image.png", -- ^ Uses texture (string) - playername = "singleplayer" + playername = "singleplayer", -- ^ optional, if specified spawns particle only on the player's client + animation = {Tile Animation definition}, + -- ^ optional, specifies how to animate the particle texture + glow = 0 + -- ^ optional, specify particle self-luminescence in darkness } + ### `ParticleSpawner` definition (`add_particlespawner`) { diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index 142734cda..5e98e1a80 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -523,6 +523,43 @@ minetest.register_craft({ } }) +minetest.register_craftitem("experimental:tester_tool_2", { + description = "Tester Tool 2", + inventory_image = "experimental_tester_tool_1.png^[invert:g", + on_use = function(itemstack, user, pointed_thing) + local pos = minetest.get_pointed_thing_position(pointed_thing, true) + if pos == nil then return end + pos = vector.add(pos, {x=0, y=0.5, z=0}) + local tex, anim + if math.random(0, 1) == 0 then + tex = "default_lava_source_animated.png" + anim = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5} + else + tex = "default_lava_flowing_animated.png" + anim = {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3} + end + + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0.04, z=0}, + expirationtime = 6, + collisiondetection = true, + texture = tex, + animation = anim, + size = 4, + glow = math.random(0, 5), + }) + end, +}) + +minetest.register_craft({ + output = 'experimental:tester_tool_2', + recipe = { + {'group:crumbly','group:crumbly'}, + } +}) + --[[minetest.register_on_joinplayer(function(player) minetest.after(3, function() player:set_inventory_formspec("size[8,7.5]".. diff --git a/src/client.h b/src/client.h index f84246deb..b33358d94 100644 --- a/src/client.h +++ b/src/client.h @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hud.h" #include "particles.h" #include "mapnode.h" +#include "tileanimation.h" struct MeshMakeData; class MapBlockMesh; @@ -186,6 +187,8 @@ struct ClientEvent bool collision_removal; bool vertical; std::string *texture; + struct TileAnimationParams animation; + u8 glow; } spawn_particle; struct{ u16 amount; @@ -206,6 +209,8 @@ struct ClientEvent bool vertical; std::string *texture; u32 id; + struct TileAnimationParams animation; + u8 glow; } add_particlespawner; struct{ u32 id; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 411982f69..b11f73e86 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "network/clientopcodes.h" #include "util/serialize.h" #include "util/srp.h" +#include "tileanimation.h" void Client::handleCommand_Deprecated(NetworkPacket* pkt) { @@ -896,9 +897,14 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt) std::string texture = deSerializeLongString(is); bool vertical = false; bool collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; + u8 glow = 0; try { vertical = readU8(is); collision_removal = readU8(is); + animation.deSerialize(is, m_proto_ver); + glow = readU8(is); } catch (...) {} ClientEvent event; @@ -912,6 +918,8 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt) event.spawn_particle.collision_removal = collision_removal; event.spawn_particle.vertical = vertical; event.spawn_particle.texture = new std::string(texture); + event.spawn_particle.animation = animation; + event.spawn_particle.glow = glow; m_client_event_queue.push(event); } @@ -943,12 +951,20 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) bool vertical = false; bool collision_removal = false; + struct TileAnimationParams animation; + animation.type = TAT_NONE; + u8 glow = 0; u16 attached_id = 0; try { *pkt >> vertical; *pkt >> collision_removal; *pkt >> attached_id; + // This is horrible but required (why are there two ways to deserialize pkts?) + std::string datastring(pkt->getRemainingString(), pkt->getRemainingBytes()); + std::istringstream is(datastring, std::ios_base::binary); + animation.deSerialize(is, m_proto_ver); + glow = readU8(is); } catch (...) {} ClientEvent event; @@ -971,6 +987,8 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) event.add_particlespawner.vertical = vertical; event.add_particlespawner.texture = new std::string(texture); event.add_particlespawner.id = id; + event.add_particlespawner.animation = animation; + event.add_particlespawner.glow = glow; m_client_event_queue.push(event); } diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp index 388afc18e..91e6c58e2 100644 --- a/src/network/networkpacket.cpp +++ b/src/network/networkpacket.cpp @@ -63,7 +63,7 @@ void NetworkPacket::putRawPacket(u8 *data, u32 datasize, u16 peer_id) m_data = std::vector(&data[2], &data[2 + m_datasize]); } -char* NetworkPacket::getString(u32 from_offset) +const char* NetworkPacket::getString(u32 from_offset) { checkReadOffset(from_offset, 0); diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h index 524470999..3e436aba9 100644 --- a/src/network/networkpacket.h +++ b/src/network/networkpacket.h @@ -41,12 +41,15 @@ public: u16 getPeerId() { return m_peer_id; } u16 getCommand() { return m_command; } const u32 getRemainingBytes() const { return m_datasize - m_read_offset; } + const char* getRemainingString() { return getString(m_read_offset); } // Returns a c-string without copying. // A better name for this would be getRawString() - char* getString(u32 from_offset); + const char* getString(u32 from_offset); // major difference to putCString(): doesn't write len into the buffer void putRawString(const char* src, u32 len); + void putRawString(const std::string &src) + { putRawString(src.c_str(), src.size()); } NetworkPacket& operator>>(std::string& dst); NetworkPacket& operator<<(std::string src); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index b7d023897..a4af26e87 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -541,7 +541,7 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, if (tile->material_flags & MATERIAL_FLAG_ANIMATION) { int frame_length_ms; tiledef->animation.determineParams(tile->texture->getOriginalSize(), - &frame_count, &frame_length_ms); + &frame_count, &frame_length_ms, NULL); tile->animation_frame_count = frame_count; tile->animation_frame_length_ms = frame_length_ms; } diff --git a/src/particles.cpp b/src/particles.cpp index d9eb3cfa5..5f17763e0 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -54,7 +54,9 @@ Particle::Particle( bool vertical, video::ITexture *texture, v2f texpos, - v2f texsize + v2f texsize, + const struct TileAnimationParams &anim, + u8 glow ): scene::ISceneNode(smgr->getRootSceneNode(), smgr) { @@ -71,7 +73,9 @@ Particle::Particle( m_material.setTexture(0, texture); m_texpos = texpos; m_texsize = texsize; - + m_animation = anim; + m_animation_frame = 0; + m_animation_time = 0.0; // Particle related m_pos = pos; @@ -84,6 +88,7 @@ Particle::Particle( m_collisiondetection = collisiondetection; m_collision_removal = collision_removal; m_vertical = vertical; + m_glow = glow; // Irrlicht stuff m_collisionbox = aabb3f @@ -142,6 +147,18 @@ void Particle::step(float dtime) m_velocity += m_acceleration * dtime; m_pos += m_velocity * dtime; } + if (m_animation.type != TAT_NONE) { + m_animation_time += dtime; + int frame_length_i, frame_count; + m_animation.determineParams( + m_material.getTexture(0)->getSize(), + &frame_count, &frame_length_i, NULL); + float frame_length = frame_length_i / 1000.0; + while (m_animation_time > frame_length) { + m_animation_frame++; + m_animation_time -= frame_length; + } + } // Update lighting updateLight(); @@ -166,16 +183,32 @@ void Particle::updateLight() else light = blend_light(m_env->getDayNightRatio(), LIGHT_SUN, 0); - m_light = decode_light(light); + m_light = decode_light(light + m_glow); } void Particle::updateVertices() { video::SColor c(255, m_light, m_light, m_light); - f32 tx0 = m_texpos.X; - f32 tx1 = m_texpos.X + m_texsize.X; - f32 ty0 = m_texpos.Y; - f32 ty1 = m_texpos.Y + m_texsize.Y; + f32 tx0, tx1, ty0, ty1; + + if (m_animation.type != TAT_NONE) { + const v2u32 texsize = m_material.getTexture(0)->getSize(); + v2f texcoord, framesize_f; + v2u32 framesize; + texcoord = m_animation.getTextureCoords(texsize, m_animation_frame); + m_animation.determineParams(texsize, NULL, NULL, &framesize); + framesize_f = v2f(framesize.X / (float) texsize.X, framesize.Y / (float) texsize.Y); + + tx0 = m_texpos.X + texcoord.X; + tx1 = m_texpos.X + texcoord.X + framesize_f.X * m_texsize.X; + ty0 = m_texpos.Y + texcoord.Y; + ty1 = m_texpos.Y + texcoord.Y + framesize_f.Y * m_texsize.Y; + } else { + tx0 = m_texpos.X; + tx1 = m_texpos.X + m_texsize.X; + ty0 = m_texpos.Y; + ty1 = m_texpos.Y + m_texsize.Y; + } m_vertices[0] = video::S3DVertex(-m_size/2,-m_size/2,0, 0,0,0, c, tx0, ty1); @@ -210,7 +243,9 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, u16 attached_id, bool vertical, - video::ITexture *texture, u32 id, ParticleManager *p_manager) : + video::ITexture *texture, u32 id, const struct TileAnimationParams &anim, + u8 glow, + ParticleManager *p_manager) : m_particlemanager(p_manager) { m_gamedef = gamedef; @@ -234,6 +269,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr, m_vertical = vertical; m_texture = texture; m_time = 0; + m_animation = anim; + m_glow = glow; for (u16 i = 0; i<=m_amount; i++) { @@ -309,7 +346,9 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env) m_vertical, m_texture, v2f(0.0, 0.0), - v2f(1.0, 1.0)); + v2f(1.0, 1.0), + m_animation, + m_glow); m_particlemanager->addParticle(toadd); } i = m_spawntimes.erase(i); @@ -363,7 +402,9 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env) m_vertical, m_texture, v2f(0.0, 0.0), - v2f(1.0, 1.0)); + v2f(1.0, 1.0), + m_animation, + m_glow); m_particlemanager->addParticle(toadd); } } @@ -494,6 +535,8 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, event->add_particlespawner.vertical, texture, event->add_particlespawner.id, + event->add_particlespawner.animation, + event->add_particlespawner.glow, this); /* delete allocated content of event */ @@ -529,13 +572,16 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, event->spawn_particle.vertical, texture, v2f(0.0, 0.0), - v2f(1.0, 1.0)); + v2f(1.0, 1.0), + event->spawn_particle.animation, + event->spawn_particle.glow); addParticle(toadd); delete event->spawn_particle.pos; delete event->spawn_particle.vel; delete event->spawn_particle.acc; + delete event->spawn_particle.texture; break; } @@ -564,6 +610,8 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s // Texture u8 texid = myrand_range(0, 5); video::ITexture *texture; + struct TileAnimationParams anim; + anim.type = TAT_NONE; // Only use first frame of animated texture if (tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION) @@ -605,7 +653,9 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s false, texture, texpos, - texsize); + texsize, + anim, + 0); addParticle(toadd); } diff --git a/src/particles.h b/src/particles.h index 00cb2c08e..5464e6672 100644 --- a/src/particles.h +++ b/src/particles.h @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/tile.h" #include "localplayer.h" #include "environment.h" +#include "tileanimation.h" struct ClientEvent; class ParticleManager; @@ -50,7 +51,9 @@ class Particle : public scene::ISceneNode bool vertical, video::ITexture *texture, v2f texpos, - v2f texsize + v2f texsize, + const struct TileAnimationParams &anim, + u8 glow ); ~Particle(); @@ -102,6 +105,10 @@ private: bool m_collision_removal; bool m_vertical; v3s16 m_camera_offset; + struct TileAnimationParams m_animation; + float m_animation_time; + int m_animation_frame; + u8 m_glow; }; class ParticleSpawner @@ -123,6 +130,7 @@ class ParticleSpawner bool vertical, video::ITexture *texture, u32 id, + const struct TileAnimationParams &anim, u8 glow, ParticleManager* p_manager); ~ParticleSpawner(); @@ -156,6 +164,8 @@ class ParticleSpawner bool m_collision_removal; bool m_vertical; u16 m_attached_id; + struct TileAnimationParams m_animation; + u8 m_glow; }; /** diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index b9bcfef69..84af4583b 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -322,7 +322,7 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) } else if(lua_istable(L, index)) { - // {name="default_lava.png", animation={}} + // name="default_lava.png" tiledef.name = ""; getstringfield(L, index, "name", tiledef.name); getstringfield(L, index, "image", tiledef.name); // MaterialSpec compat. @@ -334,28 +334,7 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) L, index, "tileable_vertical", default_tiling); // animation = {} lua_getfield(L, index, "animation"); - if(lua_istable(L, -1)){ - tiledef.animation.type = (TileAnimationType) - getenumfield(L, -1, "type", es_TileAnimationType, - TAT_NONE); - if (tiledef.animation.type == TAT_VERTICAL_FRAMES) { - // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} - tiledef.animation.vertical_frames.aspect_w = - getintfield_default(L, -1, "aspect_w", 16); - tiledef.animation.vertical_frames.aspect_h = - getintfield_default(L, -1, "aspect_h", 16); - tiledef.animation.vertical_frames.length = - getfloatfield_default(L, -1, "length", 1.0); - } else if (tiledef.animation.type == TAT_SHEET_2D) { - // {type="sheet_2d", frames_w=5, frames_h=3, frame_length=0.5} - getintfield(L, -1, "frames_w", - tiledef.animation.sheet_2d.frames_w); - getintfield(L, -1, "frames_h", - tiledef.animation.sheet_2d.frames_h); - getfloatfield(L, -1, "frame_length", - tiledef.animation.sheet_2d.frame_length); - } - } + tiledef.animation = read_animation_definition(L, -1); lua_pop(L, 1); } @@ -925,6 +904,41 @@ void read_inventory_list(lua_State *L, int tableindex, } } +/******************************************************************************/ +struct TileAnimationParams read_animation_definition(lua_State *L, int index) +{ + if(index < 0) + index = lua_gettop(L) + 1 + index; + + struct TileAnimationParams anim; + anim.type = TAT_NONE; + if (!lua_istable(L, index)) + return anim; + + anim.type = (TileAnimationType) + getenumfield(L, index, "type", es_TileAnimationType, + TAT_NONE); + if (anim.type == TAT_VERTICAL_FRAMES) { + // {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0} + anim.vertical_frames.aspect_w = + getintfield_default(L, index, "aspect_w", 16); + anim.vertical_frames.aspect_h = + getintfield_default(L, index, "aspect_h", 16); + anim.vertical_frames.length = + getfloatfield_default(L, index, "length", 1.0); + } else if (anim.type == TAT_SHEET_2D) { + // {type="sheet_2d", frames_w=5, frames_h=3, frame_length=0.5} + getintfield(L, index, "frames_w", + anim.sheet_2d.frames_w); + getintfield(L, index, "frames_h", + anim.sheet_2d.frames_h); + getfloatfield(L, index, "frame_length", + anim.sheet_2d.frame_length); + } + + return anim; +} + /******************************************************************************/ ToolCapabilities read_tool_capabilities( lua_State *L, int table) diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index 2a2228b6d..9641f5c9e 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -79,6 +79,7 @@ void push_hit_params (lua_State *L, ItemStack read_item (lua_State *L, int index, Server *srv); +struct TileAnimationParams read_animation_definition(lua_State *L, int index); ToolCapabilities read_tool_capabilities (lua_State *L, int table); void push_tool_capabilities (lua_State *L, diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp index 667ac7272..7f415844a 100644 --- a/src/script/lua_api/l_particles.cpp +++ b/src/script/lua_api/l_particles.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_object.h" #include "lua_api/l_internal.h" #include "common/c_converter.h" +#include "common/c_content.h" #include "server.h" #include "particles.h" @@ -34,6 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc., // collision_removal = bool // vertical = bool // texture = e.g."default_wood.png" +// animation = TileAnimation definition +// glow = num int ModApiParticles::l_add_particle(lua_State *L) { MAP_LOCK_REQUIRED; @@ -47,10 +50,13 @@ int ModApiParticles::l_add_particle(lua_State *L) bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; + struct TileAnimationParams animation; std::string texture = ""; std::string playername = ""; + u8 glow = 0; + if (lua_gettop(L) > 1) // deprecated { log_deprecated(L, "Deprecated add_particle call with individual parameters instead of definition"); @@ -101,11 +107,18 @@ int ModApiParticles::l_add_particle(lua_State *L) collision_removal = getboolfield_default(L, 1, "collision_removal", collision_removal); vertical = getboolfield_default(L, 1, "vertical", vertical); + + lua_getfield(L, 1, "animation"); + animation = read_animation_definition(L, -1); + lua_pop(L, 1); + texture = getstringfield_default(L, 1, "texture", ""); playername = getstringfield_default(L, 1, "playername", ""); + + glow = getintfield_default(L, 1, "glow", 0); } getServer(L)->spawnParticle(playername, pos, vel, acc, expirationtime, size, - collisiondetection, collision_removal, vertical, texture); + collisiondetection, collision_removal, vertical, texture, animation, glow); return 1; } @@ -127,6 +140,8 @@ int ModApiParticles::l_add_particle(lua_State *L) // collision_removal = bool // vertical = bool // texture = e.g."default_wood.png" +// animation = TileAnimation definition +// glow = num int ModApiParticles::l_add_particlespawner(lua_State *L) { MAP_LOCK_REQUIRED; @@ -139,9 +154,11 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) time= minexptime= maxexptime= minsize= maxsize= 1; bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; + struct TileAnimationParams animation; ServerActiveObject *attached = NULL; std::string texture = ""; std::string playername = ""; + u8 glow = 0; if (lua_gettop(L) > 1) //deprecated { @@ -201,6 +218,10 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) collision_removal = getboolfield_default(L, 1, "collision_removal", collision_removal); + lua_getfield(L, 1, "animation"); + animation = read_animation_definition(L, -1); + lua_pop(L, 1); + lua_getfield(L, 1, "attached"); if (!lua_isnil(L, -1)) { ObjectRef *ref = ObjectRef::checkobject(L, -1); @@ -211,6 +232,7 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) vertical = getboolfield_default(L, 1, "vertical", vertical); texture = getstringfield_default(L, 1, "texture", ""); playername = getstringfield_default(L, 1, "playername", ""); + glow = getintfield_default(L, 1, "glow", 0); } u32 id = getServer(L)->addParticleSpawner(amount, time, @@ -223,7 +245,8 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) collision_removal, attached, vertical, - texture, playername); + texture, playername, + animation, glow); lua_pushnumber(L, id); return 1; diff --git a/src/server.cpp b/src/server.cpp index 74d9541c9..d3d5fd3d1 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1662,12 +1662,28 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec, } // Spawns a particle on peer with peer_id -void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration, +void Server::SendSpawnParticle(u16 peer_id, u16 protocol_version, + v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture) + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow) { DSTACK(FUNCTION_NAME); + if (peer_id == PEER_ID_INEXISTENT) { + // This sucks and should be replaced by a better solution in a refactor: + std::vector clients = m_clients.getClientIDs(); + for (std::vector::iterator i = clients.begin(); i != clients.end(); ++i) { + RemotePlayer *player = m_env->getPlayer(*i); + if (!player) + continue; + SendSpawnParticle(*i, player->protocol_version, + pos, velocity, acceleration, + expirationtime, size, collisiondetection, + collision_removal, vertical, texture, animation, glow); + } + return; + } NetworkPacket pkt(TOCLIENT_SPAWN_PARTICLE, 0, peer_id); @@ -1676,22 +1692,39 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat pkt.putLongString(texture); pkt << vertical; pkt << collision_removal; + // This is horrible but required (why are there two ways to serialize pkts?) + std::ostringstream os(std::ios_base::binary); + animation.serialize(os, protocol_version); + pkt.putRawString(os.str()); + pkt << glow; - if (peer_id != PEER_ID_INEXISTENT) { - Send(&pkt); - } - else { - m_clients.sendToAll(0, &pkt, true); - } + Send(&pkt); } // Adds a ParticleSpawner on peer with peer_id -void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos, +void Server::SendAddParticleSpawner(u16 peer_id, u16 protocol_version, + u16 amount, float spawntime, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, - u16 attached_id, bool vertical, const std::string &texture, u32 id) + u16 attached_id, bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow) { DSTACK(FUNCTION_NAME); + if (peer_id == PEER_ID_INEXISTENT) { + // This sucks and should be replaced: + std::vector clients = m_clients.getClientIDs(); + for (std::vector::iterator i = clients.begin(); i != clients.end(); ++i) { + RemotePlayer *player = m_env->getPlayer(*i); + if (!player) + continue; + SendAddParticleSpawner(*i, player->protocol_version, + amount, spawntime, minpos, maxpos, + minvel, maxvel, minacc, maxacc, minexptime, maxexptime, + minsize, maxsize, collisiondetection, collision_removal, + attached_id, vertical, texture, id, animation, glow); + } + return; + } NetworkPacket pkt(TOCLIENT_ADD_PARTICLESPAWNER, 0, peer_id); @@ -1704,13 +1737,13 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3 pkt << id << vertical; pkt << collision_removal; pkt << attached_id; + // This is horrible but required + std::ostringstream os(std::ios_base::binary); + animation.serialize(os, protocol_version); + pkt.putRawString(os.str()); + pkt << glow; - if (peer_id != PEER_ID_INEXISTENT) { - Send(&pkt); - } - else { - m_clients.sendToAll(0, &pkt, true); - } + Send(&pkt); } void Server::SendDeleteParticleSpawner(u16 peer_id, u32 id) @@ -3165,23 +3198,25 @@ void Server::spawnParticle(const std::string &playername, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture) + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow) { // m_env will be NULL if the server is initializing if (!m_env) return; - u16 peer_id = PEER_ID_INEXISTENT; + u16 peer_id = PEER_ID_INEXISTENT, proto_ver = 0; if (playername != "") { RemotePlayer *player = m_env->getPlayer(playername.c_str()); if (!player) return; peer_id = player->peer_id; + proto_ver = player->protocol_version; } - SendSpawnParticle(peer_id, pos, velocity, acceleration, + SendSpawnParticle(peer_id, proto_ver, pos, velocity, acceleration, expirationtime, size, collisiondetection, - collision_removal, vertical, texture); + collision_removal, vertical, texture, animation, glow); } u32 Server::addParticleSpawner(u16 amount, float spawntime, @@ -3189,18 +3224,20 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime, float minexptime, float maxexptime, float minsize, float maxsize, bool collisiondetection, bool collision_removal, ServerActiveObject *attached, bool vertical, const std::string &texture, - const std::string &playername) + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow) { // m_env will be NULL if the server is initializing if (!m_env) return -1; - u16 peer_id = PEER_ID_INEXISTENT; + u16 peer_id = PEER_ID_INEXISTENT, proto_ver = 0; if (playername != "") { RemotePlayer *player = m_env->getPlayer(playername.c_str()); if (!player) return -1; peer_id = player->peer_id; + proto_ver = player->protocol_version; } u16 attached_id = attached ? attached->getId() : 0; @@ -3211,11 +3248,11 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime, else id = m_env->addParticleSpawner(spawntime, attached_id); - SendAddParticleSpawner(peer_id, amount, spawntime, + SendAddParticleSpawner(peer_id, proto_ver, amount, spawntime, minpos, maxpos, minvel, maxvel, minacc, maxacc, minexptime, maxexptime, minsize, maxsize, collisiondetection, collision_removal, attached_id, vertical, - texture, id); + texture, id, animation, glow); return id; } diff --git a/src/server.h b/src/server.h index a86f75f1d..e5121bdc3 100644 --- a/src/server.h +++ b/src/server.h @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mods.h" #include "inventorymanager.h" #include "subgame.h" +#include "tileanimation.h" // struct TileAnimationParams #include "util/numeric.h" #include "util/thread.h" #include "util/basic_macros.h" @@ -252,7 +253,8 @@ public: v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture); + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); u32 addParticleSpawner(u16 amount, float spawntime, v3f minpos, v3f maxpos, @@ -263,7 +265,8 @@ public: bool collisiondetection, bool collision_removal, ServerActiveObject *attached, bool vertical, const std::string &texture, - const std::string &playername); + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow); void deleteParticleSpawner(const std::string &playername, u32 id); @@ -428,7 +431,8 @@ private: void sendDetachedInventories(u16 peer_id); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, + void SendAddParticleSpawner(u16 peer_id, u16 protocol_version, + u16 amount, float spawntime, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, @@ -436,16 +440,18 @@ private: float minsize, float maxsize, bool collisiondetection, bool collision_removal, u16 attached_id, - bool vertical, const std::string &texture, u32 id); + bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow); void SendDeleteParticleSpawner(u16 peer_id, u32 id); // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendSpawnParticle(u16 peer_id, + void SendSpawnParticle(u16 peer_id, u16 protocol_version, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture); + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas); void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true); diff --git a/src/tileanimation.cpp b/src/tileanimation.cpp index a23eecc2e..67d27d396 100644 --- a/src/tileanimation.cpp +++ b/src/tileanimation.cpp @@ -69,7 +69,8 @@ void TileAnimationParams::deSerialize(std::istream &is, u16 protocol_version) } } -void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms) const +void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, + int *frame_length_ms, v2u32 *frame_size) const { if (type == TAT_VERTICAL_FRAMES) { int frame_height = (float)texture_size.X / @@ -80,15 +81,17 @@ void TileAnimationParams::determineParams(v2u32 texture_size, int *frame_count, *frame_count = _frame_count; if (frame_length_ms) *frame_length_ms = 1000.0 * vertical_frames.length / _frame_count; + if (frame_size) + *frame_size = v2u32(texture_size.X, frame_height); } else if (type == TAT_SHEET_2D) { if (frame_count) *frame_count = sheet_2d.frames_w * sheet_2d.frames_h; if (frame_length_ms) *frame_length_ms = 1000 * sheet_2d.frame_length; - } else { // TAT_NONE - *frame_count = 1; - *frame_length_ms = 1000; + if (frame_size) + *frame_size = v2u32(texture_size.X / sheet_2d.frames_w, texture_size.Y / sheet_2d.frames_h); } + // caller should check for TAT_NONE } void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const @@ -97,7 +100,7 @@ void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size return; if (type == TAT_VERTICAL_FRAMES) { int frame_count; - determineParams(texture_size, &frame_count, NULL); + determineParams(texture_size, &frame_count, NULL, NULL); os << "^[verticalframe:" << frame_count << ":" << frame; } else if (type == TAT_SHEET_2D) { int q, r; @@ -107,3 +110,22 @@ void TileAnimationParams::getTextureModifer(std::ostream &os, v2u32 texture_size << ":" << r << "," << q; } } + +v2f TileAnimationParams::getTextureCoords(v2u32 texture_size, int frame) const +{ + v2u32 ret(0, 0); + if (type == TAT_VERTICAL_FRAMES) { + int frame_height = (float)texture_size.X / + (float)vertical_frames.aspect_w * + (float)vertical_frames.aspect_h; + ret = v2u32(0, frame_height * frame); + } else if (type == TAT_SHEET_2D) { + v2u32 frame_size; + determineParams(texture_size, NULL, NULL, &frame_size); + int q, r; + q = frame / sheet_2d.frames_w; + r = frame % sheet_2d.frames_w; + ret = v2u32(r * frame_size.X, q * frame_size.Y); + } + return v2f(ret.X / (float) texture_size.X, ret.Y / (float) texture_size.Y); +} diff --git a/src/tileanimation.h b/src/tileanimation.h index 289ce515b..eecd3eb96 100644 --- a/src/tileanimation.h +++ b/src/tileanimation.h @@ -48,8 +48,10 @@ struct TileAnimationParams { void serialize(std::ostream &os, u16 protocol_version) const; void deSerialize(std::istream &is, u16 protocol_version); - void determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms) const; + void determineParams(v2u32 texture_size, int *frame_count, + int *frame_length_ms, v2u32 *frame_size) const; void getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const; + v2f getTextureCoords(v2u32 texture_size, int frame) const; }; #endif From dd282e646c42e3524bc546372c6a648e99b3c9db Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 18 Jan 2017 21:03:15 +0100 Subject: [PATCH 070/586] Fix MSVC build Build broken by 98e36d7 --- src/content_sao.cpp | 1 + src/treegen.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index bf8282af4..840e04ed9 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "content_sao.h" +#include "util/mathconstants.h" #include "util/serialize.h" #include "collision.h" #include "environment.h" diff --git a/src/treegen.cpp b/src/treegen.cpp index 4df574f34..e6c514ab9 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/pointer.h" #include "util/numeric.h" +#include "util/mathconstants.h" #include "map.h" #include "serverenvironment.h" #include "nodedef.h" From efa54f9c460239c23a2014076764d6c6830589e6 Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Fri, 20 Jan 2017 10:49:20 -0800 Subject: [PATCH 071/586] Add chatcommand unregister and override API (#5076) Introduces two functions to unregister and override chatcommands. minetest.unregister_chatcommand("") and minetest.override_chatcommand("", {}) --- builtin/game/chatcommands.lua | 18 ++++++++++++++++++ doc/lua_api.txt | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua index 199b9e964..08dc1bb1d 100644 --- a/builtin/game/chatcommands.lua +++ b/builtin/game/chatcommands.lua @@ -15,6 +15,24 @@ function core.register_chatcommand(cmd, def) core.registered_chatcommands[cmd] = def end +function core.unregister_chatcommand(name) + if core.registered_chatcommands[name] then + core.registered_chatcommands[name] = nil + else + core.log("warning", "Not unregistering chatcommand " ..name.. + " because it doesn't exist.") + end +end + +function core.override_chatcommand(name, redefinition) + local chatcommand = core.registered_chatcommands[name] + assert(chatcommand, "Attempt to override non-existent chatcommand "..name) + for k, v in pairs(redefinition) do + rawset(chatcommand, k, v) + end + core.registered_chatcommands[name] = chatcommand +end + core.register_on_chat_message(function(name, message) local cmd, param = string.match(message, "^/([^ ]+) *(.*)") if not param then diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9bdc01c07..aada851a1 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2077,6 +2077,10 @@ Call these functions only at load time! ### Other registration functions * `minetest.register_chatcommand(cmd, chatcommand definition)` * Adds definition to minetest.registered_chatcommands +* `minetest.override_chatcommand(name, redefinition)` + * Overrides fields of a chatcommand registered with register_chatcommand. +* `minetest.unregister_chatcommand(name)` + * Unregisters a chatcommands registered with register_chatcommand. * `minetest.register_privilege(name, definition)` * `definition`: `"description text"` * `definition`: `{ description = "description text", give_to_singleplayer = boolean}` From 0dada51a550c5eb52faf700dcbde4cee22a6bc70 Mon Sep 17 00:00:00 2001 From: red-001 Date: Fri, 20 Jan 2017 22:19:41 +0000 Subject: [PATCH 072/586] Remove `mathconstants.h` and use the correct way to get `M_PI` in MSVC. (#5072) --- src/CMakeLists.txt | 2 ++ src/camera.cpp | 1 - src/clientiface.cpp | 1 - src/clientmap.cpp | 1 - src/content_cao.cpp | 1 - src/content_sao.cpp | 1 - src/map.cpp | 1 - src/mg_biome.cpp | 1 - src/server.cpp | 1 - src/treegen.cpp | 1 - src/util/mathconstants.h | 7 ------- src/util/numeric.cpp | 1 - 12 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 src/util/mathconstants.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f90542be9..cab5a1139 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -284,6 +284,8 @@ if(WIN32) set(PLATFORM_LIBS dbghelp.lib ${PLATFORM_LIBS}) # Surpress some useless warnings add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 ) + # Get M_PI to work + add_definitions(/D "_USE_MATH_DEFINES") else() # Probably MinGW = GCC set(PLATFORM_LIBS "") endif() diff --git a/src/camera.cpp b/src/camera.cpp index 4768e8778..2ad835817 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -31,7 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "event.h" #include "profiler.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "constants.h" #include "fontengine.h" diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 1610c21fd..47730343c 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientiface.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "remoteplayer.h" #include "settings.h" #include "mapblock.h" diff --git a/src/clientmap.cpp b/src/clientmap.cpp index fa326f0b4..11719539f 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -29,7 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "profiler.h" #include "settings.h" #include "camera.h" // CameraModes -#include "util/mathconstants.h" #include "util/basic_macros.h" #include diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 83756c963..93ac1f785 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -26,7 +26,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_cao.h" #include "util/numeric.h" // For IntervalLimiter #include "util/serialize.h" -#include "util/mathconstants.h" #include "util/basic_macros.h" #include "client/tile.h" #include "environment.h" diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 840e04ed9..bf8282af4 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -18,7 +18,6 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "content_sao.h" -#include "util/mathconstants.h" #include "util/serialize.h" #include "collision.h" #include "environment.h" diff --git a/src/map.cpp b/src/map.cpp index 0659f66aa..f2a4b7ffe 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -32,7 +32,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "gamedef.h" #include "util/directiontables.h" -#include "util/mathconstants.h" #include "util/basic_macros.h" #include "rollback_interface.h" #include "environment.h" diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp index d564e9415..ef7e52685 100644 --- a/src/mg_biome.cpp +++ b/src/mg_biome.cpp @@ -24,7 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nodedef.h" #include "map.h" //for MMVManip #include "util/numeric.h" -#include "util/mathconstants.h" #include "porting.h" #include "settings.h" diff --git a/src/server.cpp b/src/server.cpp index d3d5fd3d1..1656b9f5a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -53,7 +53,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "event_manager.h" #include "serverlist.h" #include "util/string.h" -#include "util/mathconstants.h" #include "rollback.h" #include "util/serialize.h" #include "util/thread.h" diff --git a/src/treegen.cpp b/src/treegen.cpp index e6c514ab9..4df574f34 100644 --- a/src/treegen.cpp +++ b/src/treegen.cpp @@ -21,7 +21,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/pointer.h" #include "util/numeric.h" -#include "util/mathconstants.h" #include "map.h" #include "serverenvironment.h" #include "nodedef.h" diff --git a/src/util/mathconstants.h b/src/util/mathconstants.h deleted file mode 100644 index 1b478aa95..000000000 --- a/src/util/mathconstants.h +++ /dev/null @@ -1,7 +0,0 @@ -#include - -// MSVC doesn't seem to define this -#ifndef M_PI - #define M_PI 3.1415926535 -#endif - diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp index a9e7ae584..87f1040ea 100644 --- a/src/util/numeric.cpp +++ b/src/util/numeric.cpp @@ -18,7 +18,6 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "numeric.h" -#include "mathconstants.h" #include "log.h" #include "../constants.h" // BS, MAP_BLOCKSIZE From 2ea60156437962d7d29d20606bf5d9189059f76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Sat, 21 Jan 2017 10:41:00 +0100 Subject: [PATCH 073/586] Do not force deletion of players when mapblock is full (#5081) This fixes #4067 --- src/serverenvironment.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index d3b85a430..41cd63684 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -2146,6 +2146,12 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) continue; } + // If it's a forced delete, there are too many objects in mapblock + // Ignore players, they should not be removed on force delete + if (force_delete && obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + continue; + } + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " <<"object id="< Date: Sat, 21 Jan 2017 11:29:18 +0100 Subject: [PATCH 074/586] Warning fix for 2ea60156437962d7d29d20606bf5d9189059f76b (#5082) Neither flag as force delete nor show the warning when mapblock is full and object is a player --- src/serverenvironment.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 41cd63684..01dc3ff10 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -2086,7 +2086,9 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) if(block) { - if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { + // Force delete object if mapblock is full, but ignore players + if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER && + block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { warningstream << "ServerEnv: Trying to store id = " << obj->getId() << " statically but block " << PP(blockpos) << " already contains " @@ -2146,12 +2148,6 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) continue; } - // If it's a forced delete, there are too many objects in mapblock - // Ignore players, they should not be removed on force delete - if (force_delete && obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - continue; - } - verbosestream<<"ServerEnvironment::deactivateFarObjects(): " <<"object id="< Date: Sat, 21 Jan 2017 15:11:55 +0000 Subject: [PATCH 075/586] Detach the player from entities on death. (#5077) --- src/content_sao.cpp | 10 ++++++++++ src/content_sao.h | 1 + src/script/lua_api/l_object.cpp | 15 +-------------- src/server.cpp | 2 ++ src/serverobject.h | 2 ++ 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index bf8282af4..d6581144f 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -203,6 +203,16 @@ void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, *rotation = m_attachment_rotation; } +void UnitSAO::detachFromParent() +{ + ServerActiveObject *parent = NULL; + if (m_attachment_parent_id) + parent = m_env->getActiveObject(m_attachment_parent_id); + setAttachment(NULL, "", v3f(0, 0, 0), v3f(0, 0, 0)); + if (parent != NULL) + parent->removeAttachmentChild(m_id); +} + void UnitSAO::addAttachmentChild(int child_id) { m_attachment_child_ids.insert(child_id); diff --git a/src/content_sao.h b/src/content_sao.h index 4abe93250..884f0f406 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -49,6 +49,7 @@ public: void setBonePosition(const std::string &bone, v3f position, v3f rotation); void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void detachFromParent(); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 59c04f301..f579c0b86 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -710,20 +710,7 @@ int ObjectRef::l_set_detach(lua_State *L) ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; - - int parent_id = 0; - std::string bone = ""; - v3f position; - v3f rotation; - co->getAttachment(&parent_id, &bone, &position, &rotation); - ServerActiveObject *parent = NULL; - if (parent_id) - parent = env->getActiveObject(parent_id); - - // Do it - co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0)); - if (parent != NULL) - parent->removeAttachmentChild(co->getId()); + co->detachFromParent(); return 0; } diff --git a/src/server.cpp b/src/server.cpp index 1656b9f5a..1e5704042 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2560,6 +2560,8 @@ void Server::DiePlayer(u16 peer_id) if (!playersao) return; + playersao->detachFromParent(); + infostream << "Server::DiePlayer(): Player " << playersao->getPlayer()->getName() << " dies" << std::endl; diff --git a/src/serverobject.h b/src/serverobject.h index 38204980e..dfe6312f0 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -166,6 +166,8 @@ public: {} virtual void removeAttachmentChild(int child_id) {} + virtual void detachFromParent() + {} virtual const UNORDERED_SET &getAttachmentChildIds() { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() From c57b4ff9b592617539aa978374c13cdd5f1603a6 Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 14 Jan 2017 19:32:10 +0100 Subject: [PATCH 076/586] Add Entity get_texture_mod() to Lua API Send texture modifier to clients connecting later too --- doc/lua_api.txt | 1 + src/content_cao.cpp | 26 ++++++++++++++++++++------ src/content_cao.h | 4 +++- src/content_sao.cpp | 12 +++++++++++- src/content_sao.h | 2 ++ src/script/lua_api/l_object.cpp | 13 +++++++++++++ src/script/lua_api/l_object.h | 3 +++ 7 files changed, 53 insertions(+), 8 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index aada851a1..e5a3362ee 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2848,6 +2848,7 @@ This is basically a reference to a C++ `ServerActiveObject` * `set_yaw(radians)` * `get_yaw()`: returns number in radians * `set_texture_mod(mod)` +* `get_texture_mod()` returns current texture modifier * `set_sprite(p={x=0,y=0}, num_frames=1, framelength=0.2, select_horiz_by_yawpitch=false)` * Select sprite from spritesheet with optional animation and DM-style diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 93ac1f785..e829fc761 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -574,6 +574,8 @@ GenericCAO::GenericCAO(Client *client, ClientEnvironment *env): m_anim_framelength(0.2), m_anim_timer(0), m_reset_textures_timer(-1), + m_previous_texture_modifier(""), + m_current_texture_modifier(""), m_visuals_expired(false), m_step_distance_counter(0), m_last_light(255), @@ -952,7 +954,10 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, infostream<<"GenericCAO::addToScene(): \""<= 0) { m_reset_textures_timer -= dtime; - if(m_reset_textures_timer <= 0){ + if(m_reset_textures_timer <= 0) { m_reset_textures_timer = -1; - updateTextures(""); + updateTextures(m_previous_texture_modifier); } } if(getParent() == NULL && fabs(m_prop.automatic_rotate) > 0.001) @@ -1301,7 +1306,7 @@ void GenericCAO::updateTexturePos() } } -void GenericCAO::updateTextures(const std::string &mod) +void GenericCAO::updateTextures(const std::string mod) { ITextureSource *tsrc = m_client->tsrc(); @@ -1309,6 +1314,9 @@ void GenericCAO::updateTextures(const std::string &mod) bool use_bilinear_filter = g_settings->getBool("bilinear_filter"); bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter"); + m_previous_texture_modifier = m_current_texture_modifier; + m_current_texture_modifier = mod; + if(m_spritenode) { if(m_prop.visual == "sprite") @@ -1611,6 +1619,12 @@ void GenericCAO::processMessage(const std::string &data) updateNodePos(); } else if (cmd == GENERIC_CMD_SET_TEXTURE_MOD) { std::string mod = deSerializeString(is); + + // immediatly reset a engine issued texture modifier if a mod sends a different one + if (m_reset_textures_timer > 0) { + m_reset_textures_timer = -1; + updateTextures(m_previous_texture_modifier); + } updateTextures(mod); } else if (cmd == GENERIC_CMD_SET_SPRITE) { v2s16 p = readV2S16(is); @@ -1734,7 +1748,7 @@ void GenericCAO::processMessage(const std::string &data) m_reset_textures_timer = 0.05; if(damage >= 2) m_reset_textures_timer += 0.05 * damage; - updateTextures("^[brighten"); + updateTextures(m_current_texture_modifier + "^[brighten"); } } } else if (cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) { @@ -1802,7 +1816,7 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, m_reset_textures_timer = 0.05; if(result.damage >= 2) m_reset_textures_timer += 0.05 * result.damage; - updateTextures("^[brighten"); + updateTextures(m_current_texture_modifier + "^[brighten"); } return false; diff --git a/src/content_cao.h b/src/content_cao.h index 846e0690a..f30e90e21 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -102,6 +102,8 @@ private: float m_anim_timer; ItemGroupList m_armor_groups; float m_reset_textures_timer; + std::string m_previous_texture_modifier; // stores texture modifier before punch update + std::string m_current_texture_modifier; // last applied texture modifier bool m_visuals_expired; float m_step_distance_counter; u8 m_last_light; @@ -198,7 +200,7 @@ public: void updateTexturePos(); - void updateTextures(const std::string &mod); + void updateTextures(const std::string mod); void updateAnimation(); diff --git a/src/content_sao.cpp b/src/content_sao.cpp index d6581144f..f0973082d 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -257,7 +257,8 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, m_last_sent_position(0,0,0), m_last_sent_velocity(0,0,0), m_last_sent_position_timer(0), - m_last_sent_move_precision(0) + m_last_sent_move_precision(0), + m_current_texture_modifier("") { // Only register type if no environment supplied if(env == NULL){ @@ -511,6 +512,9 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) } } + msg_os << serializeLongString(gob_cmd_set_texture_mod(m_current_texture_modifier)); + message_count++; + writeU8(os, message_count); os.write(msg_os.str().c_str(), msg_os.str().size()); } @@ -687,11 +691,17 @@ v3f LuaEntitySAO::getAcceleration() void LuaEntitySAO::setTextureMod(const std::string &mod) { std::string str = gob_cmd_set_texture_mod(mod); + m_current_texture_modifier = mod; // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } +std::string LuaEntitySAO::getTextureMod() const +{ + return m_current_texture_modifier; +} + void LuaEntitySAO::setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch) { diff --git a/src/content_sao.h b/src/content_sao.h index 884f0f406..56a26fb0d 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -122,6 +122,7 @@ public: v3f getAcceleration(); void setTextureMod(const std::string &mod); + std::string getTextureMod() const; void setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch); std::string getName(); @@ -143,6 +144,7 @@ private: v3f m_last_sent_velocity; float m_last_sent_position_timer; float m_last_sent_move_precision; + std::string m_current_texture_modifier; }; /* diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index f579c0b86..1fa3663ca 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -900,6 +900,19 @@ int ObjectRef::l_set_texture_mod(lua_State *L) return 0; } +// get_texture_mod(self) +int ObjectRef::l_get_texture_mod(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + LuaEntitySAO *co = getluaobject(ref); + if (co == NULL) return 0; + // Do it + std::string mod = co->getTextureMod(); + lua_pushstring(L, mod.c_str()); + return 1; +} + // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) int ObjectRef::l_set_sprite(lua_State *L) diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 06b1bb79b..96d0abae8 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -164,6 +164,9 @@ private: // set_texture_mod(self, mod) static int l_set_texture_mod(lua_State *L); + // l_get_texture_mod(self) + static int l_get_texture_mod(lua_State *L); + // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, // select_horiz_by_yawpitch=false) static int l_set_sprite(lua_State *L); From b9c1a758a1e987dfb0284c08dd96d4d17114882f Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 21 Jan 2017 17:11:06 +0100 Subject: [PATCH 077/586] Fix unknown command message not providing number of cmd --- src/content_cao.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index e829fc761..5dc3866cf 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1779,7 +1779,7 @@ void GenericCAO::processMessage(const std::string &data) } else { warningstream << FUNCTION_NAME << ": unknown command or outdated client \"" - << cmd << std::endl; + << +cmd << "\"" << std::endl; } } From bc29e03b597be350fa856b1ae3d8623778a808b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Sat, 21 Jan 2017 17:30:55 +0100 Subject: [PATCH 078/586] Revert "Detach the player from entities on death." (#5087) --- src/content_sao.cpp | 10 ---------- src/content_sao.h | 1 - src/script/lua_api/l_object.cpp | 15 ++++++++++++++- src/server.cpp | 2 -- src/serverobject.h | 2 -- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index f0973082d..bb62aea7d 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -203,16 +203,6 @@ void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, *rotation = m_attachment_rotation; } -void UnitSAO::detachFromParent() -{ - ServerActiveObject *parent = NULL; - if (m_attachment_parent_id) - parent = m_env->getActiveObject(m_attachment_parent_id); - setAttachment(NULL, "", v3f(0, 0, 0), v3f(0, 0, 0)); - if (parent != NULL) - parent->removeAttachmentChild(m_id); -} - void UnitSAO::addAttachmentChild(int child_id) { m_attachment_child_ids.insert(child_id); diff --git a/src/content_sao.h b/src/content_sao.h index 56a26fb0d..c3674fa2d 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -49,7 +49,6 @@ public: void setBonePosition(const std::string &bone, v3f position, v3f rotation); void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void detachFromParent(); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 1fa3663ca..be4451704 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -710,7 +710,20 @@ int ObjectRef::l_set_detach(lua_State *L) ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; - co->detachFromParent(); + + int parent_id = 0; + std::string bone = ""; + v3f position; + v3f rotation; + co->getAttachment(&parent_id, &bone, &position, &rotation); + ServerActiveObject *parent = NULL; + if (parent_id) + parent = env->getActiveObject(parent_id); + + // Do it + co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0)); + if (parent != NULL) + parent->removeAttachmentChild(co->getId()); return 0; } diff --git a/src/server.cpp b/src/server.cpp index 1e5704042..1656b9f5a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2560,8 +2560,6 @@ void Server::DiePlayer(u16 peer_id) if (!playersao) return; - playersao->detachFromParent(); - infostream << "Server::DiePlayer(): Player " << playersao->getPlayer()->getName() << " dies" << std::endl; diff --git a/src/serverobject.h b/src/serverobject.h index dfe6312f0..38204980e 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -166,8 +166,6 @@ public: {} virtual void removeAttachmentChild(int child_id) {} - virtual void detachFromParent() - {} virtual const UNORDERED_SET &getAttachmentChildIds() { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() From 6d5a40713347424084af8ba04e76278961506881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Sat, 21 Jan 2017 19:30:42 +0100 Subject: [PATCH 079/586] Add show_statusline_on_connect setting (#5084) Add show_statusline_on_connect setting --- builtin/settingtypes.txt | 3 +++ minetest.conf.example | 6 +++++- src/defaultsettings.cpp | 1 + src/server.cpp | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 2dfe86e04..0f416bc9a 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -703,6 +703,9 @@ map-dir (Map directory) path # Setting it to -1 disables the feature. item_entity_ttl (Item entity TTL) int 900 +# If enabled, show the server status message on player connection. +show_statusline_on_connect (Status message on connection) bool true + # Enable players getting damage and dying. enable_damage (Damage) bool false diff --git a/minetest.conf.example b/minetest.conf.example index 3b686aa61..515b6cfd4 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -841,6 +841,10 @@ # type: int # item_entity_ttl = 900 +# If enabled, show the server status message on player connection. +# type: bool +# show_statusline_on_connect = true + # Enable players getting damage and dying. # type: bool # enable_damage = false @@ -1558,7 +1562,7 @@ # profiler.default_report_format = txt # The file path relative to your worldpath in which profiles will be saved to. -# +# # type: string # profiler.report_path = "" diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 59cfdd50d..e154a63c8 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -255,6 +255,7 @@ void set_default_settings(Settings *settings) settings->setDefault("motd", ""); settings->setDefault("max_users", "15"); settings->setDefault("creative_mode", "false"); + settings->setDefault("show_statusline_on_connect", "true"); settings->setDefault("enable_damage", "true"); settings->setDefault("give_initial_stuff", "false"); settings->setDefault("default_password", ""); diff --git a/src/server.cpp b/src/server.cpp index 1656b9f5a..7e1ab30ac 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1118,7 +1118,7 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id) SendDeathscreen(peer_id, false, v3f(0,0,0)); // Note things in chat if not in simple singleplayer mode - if(!m_simple_singleplayer_mode) { + if (!m_simple_singleplayer_mode && g_settings->getBool("show_statusline_on_connect")) { // Send information about server to player in chat SendChatMessage(peer_id, getStatusString()); } From 39123fcce5e983e83234971571b3cfaa458970b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Sat, 21 Jan 2017 22:05:54 +0100 Subject: [PATCH 080/586] Remove os.exit from the Lua secure sandbox (#5090) os.exit will exit not using proper resource liberation paths. Mods should call the proper exit mod using our API --- src/script/cpp_api/s_security.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp index 1b1f148cd..be2b884cc 100644 --- a/src/script/cpp_api/s_security.cpp +++ b/src/script/cpp_api/s_security.cpp @@ -99,7 +99,6 @@ void ScriptApiSecurity::initializeSecurity() "clock", "date", "difftime", - "exit", "getenv", "setlocale", "time", From 43822de5c6b35646feced5ac65331313f82f78ce Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 22 Jan 2017 20:17:13 +0100 Subject: [PATCH 081/586] Fix potential crash in chat handling (since 2f56a00d9eef82052614e5854a07b39b087efd0b) --- src/server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.cpp b/src/server.cpp index 7e1ab30ac..c7d4fcba9 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2864,7 +2864,7 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna */ u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT); - if (player->protocol_version >= 29) + if (player && player->protocol_version >= 29) peer_id_to_avoid_sending = PEER_ID_INEXISTENT; for (u16 i = 0; i < clients.size(); i++) { From d04d8aba7029a2501854a2838fd282b81358a54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Thu, 12 Jan 2017 15:46:30 +0100 Subject: [PATCH 082/586] Add hardware node coloring. Includes: - Increase ContentFeatures serialization version - Color property and palettes for nodes - paramtype2 = "color", "colored facedir" or "colored wallmounted" --- .../shaders/nodes_shader/opengl_vertex.glsl | 43 +- .../water_surface_shader/opengl_vertex.glsl | 45 +- .../shaders/wielded_shader/opengl_vertex.glsl | 1 - doc/lua_api.txt | 27 +- src/client/tile.cpp | 3 - src/client/tile.h | 34 +- src/clientenvironment.cpp | 4 +- src/content_mapblock.cpp | 326 +++++++---- src/game.cpp | 30 +- src/mapblock_mesh.cpp | 265 +++++---- src/mapblock_mesh.h | 57 +- src/mapnode.cpp | 20 +- src/mapnode.h | 12 +- src/mesh.cpp | 47 +- src/mesh.h | 14 +- src/minimap.cpp | 29 +- src/minimap.h | 4 +- src/network/networkprotocol.h | 5 +- src/nodedef.cpp | 513 ++++++++++++++---- src/nodedef.h | 108 ++-- src/particles.cpp | 65 ++- src/particles.h | 19 +- src/script/common/c_content.cpp | 18 + src/script/cpp_api/s_node.cpp | 3 + src/shader.cpp | 2 +- src/wieldmesh.cpp | 62 ++- src/wieldmesh.h | 5 + 27 files changed, 1207 insertions(+), 554 deletions(-) diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 44c48cc4c..3ac79c26d 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,7 +1,8 @@ uniform mat4 mWorldViewProj; uniform mat4 mWorld; -uniform float dayNightRatio; +// Color of the light emitted by the sun. +uniform vec3 dayLight; uniform vec3 eyePosition; uniform float animationTimer; @@ -14,6 +15,8 @@ varying vec3 tsEyeVec; varying vec3 tsLightVec; varying float area_enable_parallax; +// Color of the light emitted by the light sources. +const vec3 artificialLight = vec3(1.04, 1.04, 1.04); const float e = 2.718281828459; const float BS = 10.0; @@ -119,31 +122,23 @@ float disp_z; v.z = dot(eyeVec, normal); tsEyeVec = normalize (v); + // Calculate color. + // Red, green and blue components are pre-multiplied with + // the brightness, so now we have to multiply these + // colors with the color of the incoming light. + // The pre-baked colors are halved to prevent overflow. vec4 color; - float day = gl_Color.r; - float night = gl_Color.g; - float light_source = gl_Color.b; - - float rg = mix(night, day, dayNightRatio); - rg += light_source * 2.5; // Make light sources brighter - float b = rg; - - // Moonlight is blue - b += (day - night) / 13.0; - rg -= (day - night) / 23.0; - + // The alpha gives the ratio of sunlight in the incoming light. + float nightRatio = 1 - gl_Color.a; + color.rgb = gl_Color.rgb * (gl_Color.a * dayLight.rgb + + nightRatio * artificialLight.rgb) * 2; + color.a = 1; + // Emphase blue a bit in darker places // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - b += max(0.0, (1.0 - abs(b - 0.13) / 0.17) * 0.025); - - // Artificial light is yellow-ish - // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - rg += max(0.0, (1.0 - abs(rg - 0.85) / 0.15) * 0.065); - - color.r = rg; - color.g = rg; - color.b = b; - - color.a = gl_Color.a; + float brightness = (color.r + color.g + color.b) / 3; + color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + + 0.07 * brightness); + gl_FrontColor = gl_BackColor = clamp(color, 0.0, 1.0); } diff --git a/client/shaders/water_surface_shader/opengl_vertex.glsl b/client/shaders/water_surface_shader/opengl_vertex.glsl index a930e7b8f..112db9bb5 100644 --- a/client/shaders/water_surface_shader/opengl_vertex.glsl +++ b/client/shaders/water_surface_shader/opengl_vertex.glsl @@ -1,7 +1,8 @@ uniform mat4 mWorldViewProj; uniform mat4 mWorld; -uniform float dayNightRatio; +// Color of the light emitted by the sun. +uniform vec3 dayLight; uniform vec3 eyePosition; uniform float animationTimer; @@ -13,6 +14,8 @@ varying vec3 lightVec; varying vec3 tsEyeVec; varying vec3 tsLightVec; +// Color of the light emitted by the light sources. +const vec3 artificialLight = vec3(1.04, 1.04, 1.04); const float e = 2.718281828459; const float BS = 10.0; @@ -112,31 +115,23 @@ void main(void) eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; tsEyeVec = eyeVec * tbnMatrix; + // Calculate color. + // Red, green and blue components are pre-multiplied with + // the brightness, so now we have to multiply these + // colors with the color of the incoming light. + // The pre-baked colors are halved to prevent overflow. vec4 color; - float day = gl_Color.r; - float night = gl_Color.g; - float light_source = gl_Color.b; - - float rg = mix(night, day, dayNightRatio); - rg += light_source * 2.5; // Make light sources brighter - float b = rg; - - // Moonlight is blue - b += (day - night) / 13.0; - rg -= (day - night) / 23.0; - + // The alpha gives the ratio of sunlight in the incoming light. + float nightRatio = 1 - gl_Color.a; + color.rgb = gl_Color.rgb * (gl_Color.a * dayLight.rgb + + nightRatio * artificialLight.rgb) * 2; + color.a = 1; + // Emphase blue a bit in darker places // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025); - - // Artificial light is yellow-ish - // See C++ implementation in mapblock_mesh.cpp finalColorBlend() - rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065); - - color.r = rg; - color.g = rg; - color.b = b; - - color.a = gl_Color.a; - gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0); + float brightness = (color.r + color.g + color.b) / 3; + color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + + 0.07 * brightness); + + gl_FrontColor = gl_BackColor = clamp(color, 0.0, 1.0); } diff --git a/client/shaders/wielded_shader/opengl_vertex.glsl b/client/shaders/wielded_shader/opengl_vertex.glsl index 86c626896..9f05b833a 100644 --- a/client/shaders/wielded_shader/opengl_vertex.glsl +++ b/client/shaders/wielded_shader/opengl_vertex.glsl @@ -1,7 +1,6 @@ uniform mat4 mWorldViewProj; uniform mat4 mWorld; -uniform float dayNightRatio; uniform vec3 eyePosition; uniform float animationTimer; diff --git a/doc/lua_api.txt b/doc/lua_api.txt index e5a3362ee..2a0b72053 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -638,6 +638,19 @@ node definition: bit 4 (0x10) - Makes the plant mesh 1.4x larger bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max) bits 6-7 are reserved for future use. + paramtype2 == "color" + ^ `param2` tells which color is picked from the palette. + The palette should have 256 pixels. + paramtype2 == "colorfacedir" + ^ Same as `facedir`, but with colors. + The first three bits of `param2` tells which color + is picked from the palette. + The palette should have 8 pixels. + paramtype2 == "colorwallmounted" + ^ Same as `wallmounted`, but with colors. + The first five bits of `param2` tells which color + is picked from the palette. + The palette should have 32 pixels. collision_box = { type = "fixed", fixed = { @@ -3707,6 +3720,9 @@ Definition tables when displacement mapping is used Directions are from the point of view of the tile texture, not the node it's on +* `{name="image.png", color=ColorSpec}` + * the texture's color will be multiplied with this color. + * the tile's color overrides the owning node's color in all cases. * deprecated, yet still supported field names: * `image` (name) @@ -3749,8 +3765,17 @@ Definition tables special_tiles = {tile definition 1, Tile definition 2}, --[[ ^ Special textures of node; used rarely (old field name: special_materials) ^ List can be shortened to needed length ]] - alpha = 255, + color = ColorSpec, --[[ + ^ The node's original color will be multiplied with this color. + ^ If the node has a palette, then this setting only has an effect + ^ in the inventory and on the wield item. ]] use_texture_alpha = false, -- Use texture's alpha channel + palette = "palette.png", --[[ + ^ The node's `param2` is used to select a pixel from the image + ^ (pixels are arranged from left to right and from top to bottom). + ^ The node's color will be multiplied with the selected pixel's + ^ color. Tiles can override this behavior. + ^ Only when `paramtype2` supports palettes. ]] post_effect_color = "green#0F", -- If player is inside node, see "ColorSpec" paramtype = "none", -- See "Nodes" --[[ ^ paramtype = "light" allows light to propagate from or through the node with light value diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 4d2166342..539c29445 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -378,9 +378,6 @@ public: video::ITexture* generateTextureFromMesh( const TextureFromMeshParams ¶ms); - // Generates an image from a full string like - // "stone.png^mineral_coal.png^[crack:1:0". - // Shall be called from the main thread. video::IImage* generateImage(const std::string &name); video::ITexture* getNormalTexture(const std::string &name); diff --git a/src/client/tile.h b/src/client/tile.h index 452804801..d04ab918a 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -108,6 +108,12 @@ public: const std::string &name, u32 *id = NULL) = 0; virtual IrrlichtDevice* getDevice()=0; virtual bool isKnownSourceImage(const std::string &name)=0; + /*! Generates an image from a full string like + * "stone.png^mineral_coal.png^[crack:1:0". + * Shall be called from the main thread. + * The returned Image should be dropped. + */ + virtual video::IImage* generateImage(const std::string &name)=0; virtual video::ITexture* generateTextureFromMesh( const TextureFromMeshParams ¶ms)=0; virtual video::ITexture* getNormalTexture(const std::string &name)=0; @@ -192,7 +198,6 @@ struct TileSpec texture(NULL), normal_texture(NULL), flags_texture(NULL), - alpha(255), material_type(TILE_MATERIAL_BASIC), material_flags( //0 // <- DEBUG, Use the one below @@ -201,22 +206,30 @@ struct TileSpec shader_id(0), animation_frame_count(1), animation_frame_length_ms(0), - rotation(0) + rotation(0), + has_color(false), + color(), + emissive_light(0) { } + /*! + * Two tiles are equal if they can be appended to + * the same mesh buffer. + */ bool operator==(const TileSpec &other) const { return ( texture_id == other.texture_id && - /* texture == other.texture && */ - alpha == other.alpha && material_type == other.material_type && material_flags == other.material_flags && rotation == other.rotation ); } + /*! + * Two tiles are not equal if they must be in different mesh buffers. + */ bool operator!=(const TileSpec &other) const { return !(*this == other); @@ -233,7 +246,7 @@ struct TileSpec material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_TRANSPARENT: - material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_OPAQUE: material.MaterialType = video::EMT_SOLID; @@ -274,8 +287,6 @@ struct TileSpec video::ITexture *normal_texture; video::ITexture *flags_texture; - // Vertex alpha (when MATERIAL_ALPHA_VERTEX is used) - u8 alpha; // Material parameters u8 material_type; u8 material_flags; @@ -286,5 +297,14 @@ struct TileSpec std::vector frames; u8 rotation; + //! If true, the tile has its own color. + bool has_color; + /*! + * The color of the tile, or if the tile does not own + * a color then the color of the node owning this tile. + */ + video::SColor color; + //! This much light does the tile emit. + u8 emissive_light; }; #endif diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp index b32a02f2d..77f53d214 100644 --- a/src/clientenvironment.cpp +++ b/src/clientenvironment.cpp @@ -334,9 +334,7 @@ void ClientEnvironment::step(float dtime) node_at_lplayer = m_map->getNodeNoEx(p); u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); - u8 day = light & 0xff; - u8 night = (light >> 8) & 0xff; - finalColorBlend(lplayer->light_color, day, night, day_night_ratio); + final_color_blend(&lplayer->light_color, light, day_night_ratio); } /* diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index a7134590b..742bfb1fd 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -32,28 +32,29 @@ with this program; if not, write to the Free Software Foundation, Inc., // Create a cuboid. -// collector - the MeshCollector for the resulting polygons -// box - the position and size of the box -// tiles - the tiles (materials) to use (for all 6 faces) -// tilecount - number of entries in tiles, 1<=tilecount<=6 -// c - vertex colour - used for all -// txc - texture coordinates - this is a list of texture coordinates -// for the opposite corners of each face - therefore, there -// should be (2+2)*6=24 values in the list. Alternatively, pass -// NULL to use the entire texture for each face. The order of -// the faces in the list is up-down-right-left-back-front -// (compatible with ContentFeatures). If you specified 0,0,1,1 -// for each face, that would be the same as passing NULL. +// collector - the MeshCollector for the resulting polygons +// box - the position and size of the box +// tiles - the tiles (materials) to use (for all 6 faces) +// tilecount - number of entries in tiles, 1<=tilecount<=6 +// c - colors of the cuboid's six sides +// txc - texture coordinates - this is a list of texture coordinates +// for the opposite corners of each face - therefore, there +// should be (2+2)*6=24 values in the list. Alternatively, +// pass NULL to use the entire texture for each face. The +// order of the faces in the list is up-down-right-left-back- +// front (compatible with ContentFeatures). If you specified +// 0,0,1,1 for each face, that would be the same as +// passing NULL. +// light source - if greater than zero, the box's faces will not be shaded void makeCuboid(MeshCollector *collector, const aabb3f &box, - TileSpec *tiles, int tilecount, video::SColor &c, const f32* txc) + TileSpec *tiles, int tilecount, const video::SColor *c, + const f32* txc, const u8 light_source) { assert(tilecount >= 1 && tilecount <= 6); // pre-condition v3f min = box.MinEdge; v3f max = box.MaxEdge; - - if(txc == NULL) { static const f32 txc_default[24] = { 0,0,1,1, @@ -66,38 +67,53 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box, txc = txc_default; } + video::SColor c1 = c[0]; + video::SColor c2 = c[1]; + video::SColor c3 = c[2]; + video::SColor c4 = c[3]; + video::SColor c5 = c[4]; + video::SColor c6 = c[5]; + if (!light_source) { + applyFacesShading(c1, v3f(0, 1, 0)); + applyFacesShading(c2, v3f(0, -1, 0)); + applyFacesShading(c3, v3f(1, 0, 0)); + applyFacesShading(c4, v3f(-1, 0, 0)); + applyFacesShading(c5, v3f(0, 0, 1)); + applyFacesShading(c6, v3f(0, 0, -1)); + } + video::S3DVertex vertices[24] = { // up - video::S3DVertex(min.X,max.Y,max.Z, 0,1,0, c, txc[0],txc[1]), - video::S3DVertex(max.X,max.Y,max.Z, 0,1,0, c, txc[2],txc[1]), - video::S3DVertex(max.X,max.Y,min.Z, 0,1,0, c, txc[2],txc[3]), - video::S3DVertex(min.X,max.Y,min.Z, 0,1,0, c, txc[0],txc[3]), + video::S3DVertex(min.X,max.Y,max.Z, 0,1,0, c1, txc[0],txc[1]), + video::S3DVertex(max.X,max.Y,max.Z, 0,1,0, c1, txc[2],txc[1]), + video::S3DVertex(max.X,max.Y,min.Z, 0,1,0, c1, txc[2],txc[3]), + video::S3DVertex(min.X,max.Y,min.Z, 0,1,0, c1, txc[0],txc[3]), // down - video::S3DVertex(min.X,min.Y,min.Z, 0,-1,0, c, txc[4],txc[5]), - video::S3DVertex(max.X,min.Y,min.Z, 0,-1,0, c, txc[6],txc[5]), - video::S3DVertex(max.X,min.Y,max.Z, 0,-1,0, c, txc[6],txc[7]), - video::S3DVertex(min.X,min.Y,max.Z, 0,-1,0, c, txc[4],txc[7]), + video::S3DVertex(min.X,min.Y,min.Z, 0,-1,0, c2, txc[4],txc[5]), + video::S3DVertex(max.X,min.Y,min.Z, 0,-1,0, c2, txc[6],txc[5]), + video::S3DVertex(max.X,min.Y,max.Z, 0,-1,0, c2, txc[6],txc[7]), + video::S3DVertex(min.X,min.Y,max.Z, 0,-1,0, c2, txc[4],txc[7]), // right - video::S3DVertex(max.X,max.Y,min.Z, 1,0,0, c, txc[ 8],txc[9]), - video::S3DVertex(max.X,max.Y,max.Z, 1,0,0, c, txc[10],txc[9]), - video::S3DVertex(max.X,min.Y,max.Z, 1,0,0, c, txc[10],txc[11]), - video::S3DVertex(max.X,min.Y,min.Z, 1,0,0, c, txc[ 8],txc[11]), + video::S3DVertex(max.X,max.Y,min.Z, 1,0,0, c3, txc[ 8],txc[9]), + video::S3DVertex(max.X,max.Y,max.Z, 1,0,0, c3, txc[10],txc[9]), + video::S3DVertex(max.X,min.Y,max.Z, 1,0,0, c3, txc[10],txc[11]), + video::S3DVertex(max.X,min.Y,min.Z, 1,0,0, c3, txc[ 8],txc[11]), // left - video::S3DVertex(min.X,max.Y,max.Z, -1,0,0, c, txc[12],txc[13]), - video::S3DVertex(min.X,max.Y,min.Z, -1,0,0, c, txc[14],txc[13]), - video::S3DVertex(min.X,min.Y,min.Z, -1,0,0, c, txc[14],txc[15]), - video::S3DVertex(min.X,min.Y,max.Z, -1,0,0, c, txc[12],txc[15]), + video::S3DVertex(min.X,max.Y,max.Z, -1,0,0, c4, txc[12],txc[13]), + video::S3DVertex(min.X,max.Y,min.Z, -1,0,0, c4, txc[14],txc[13]), + video::S3DVertex(min.X,min.Y,min.Z, -1,0,0, c4, txc[14],txc[15]), + video::S3DVertex(min.X,min.Y,max.Z, -1,0,0, c4, txc[12],txc[15]), // back - video::S3DVertex(max.X,max.Y,max.Z, 0,0,1, c, txc[16],txc[17]), - video::S3DVertex(min.X,max.Y,max.Z, 0,0,1, c, txc[18],txc[17]), - video::S3DVertex(min.X,min.Y,max.Z, 0,0,1, c, txc[18],txc[19]), - video::S3DVertex(max.X,min.Y,max.Z, 0,0,1, c, txc[16],txc[19]), + video::S3DVertex(max.X,max.Y,max.Z, 0,0,1, c5, txc[16],txc[17]), + video::S3DVertex(min.X,max.Y,max.Z, 0,0,1, c5, txc[18],txc[17]), + video::S3DVertex(min.X,min.Y,max.Z, 0,0,1, c5, txc[18],txc[19]), + video::S3DVertex(max.X,min.Y,max.Z, 0,0,1, c5, txc[16],txc[19]), // front - video::S3DVertex(min.X,max.Y,min.Z, 0,0,-1, c, txc[20],txc[21]), - video::S3DVertex(max.X,max.Y,min.Z, 0,0,-1, c, txc[22],txc[21]), - video::S3DVertex(max.X,min.Y,min.Z, 0,0,-1, c, txc[22],txc[23]), - video::S3DVertex(min.X,min.Y,min.Z, 0,0,-1, c, txc[20],txc[23]), + video::S3DVertex(min.X,max.Y,min.Z, 0,0,-1, c6, txc[20],txc[21]), + video::S3DVertex(max.X,max.Y,min.Z, 0,0,-1, c6, txc[22],txc[21]), + video::S3DVertex(max.X,min.Y,min.Z, 0,0,-1, c6, txc[22],txc[23]), + video::S3DVertex(min.X,min.Y,min.Z, 0,0,-1, c6, txc[20],txc[23]), }; for(int i = 0; i < 6; i++) @@ -164,6 +180,31 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box, } } +// Create a cuboid. +// collector - the MeshCollector for the resulting polygons +// box - the position and size of the box +// tiles - the tiles (materials) to use (for all 6 faces) +// tilecount - number of entries in tiles, 1<=tilecount<=6 +// c - color of the cuboid +// txc - texture coordinates - this is a list of texture coordinates +// for the opposite corners of each face - therefore, there +// should be (2+2)*6=24 values in the list. Alternatively, +// pass NULL to use the entire texture for each face. The +// order of the faces in the list is up-down-right-left-back- +// front (compatible with ContentFeatures). If you specified +// 0,0,1,1 for each face, that would be the same as +// passing NULL. +// light source - if greater than zero, the box's faces will not be shaded +void makeCuboid(MeshCollector *collector, const aabb3f &box, TileSpec *tiles, + int tilecount, const video::SColor &c, const f32* txc, + const u8 light_source) +{ + video::SColor color[6]; + for (u8 i = 0; i < 6; i++) + color[i] = c; + makeCuboid(collector, box, tiles, tilecount, color, txc, light_source); +} + static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, MeshMakeData *data, MapNode n, int v, int *neighbors) { @@ -181,6 +222,18 @@ static inline int NeighborToIndex(const v3s16 &pos) return 9 * pos.X + 3 * pos.Y + pos.Z + 13; } +/*! + * Returns the i-th special tile for a map node. + */ +static TileSpec getSpecialTile(const ContentFeatures &f, + const MapNode &n, u8 i) +{ + TileSpec copy = f.special_tiles[i]; + if (!copy.has_color) + n.getColor(f, ©.color); + return copy; +} + /* TODO: Fix alpha blending for special nodes Currently only the last element rendered is blended correct @@ -227,8 +280,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data, /* Add water sources to mesh if using new style */ - TileSpec tile_liquid = f.special_tiles[0]; + TileSpec tile_liquid = getSpecialTile(f, n, 0); TileSpec tile_liquid_bfculled = getNodeTile(n, p, v3s16(0,0,0), data); + u16 l = getInteriorLight(n, 0, nodedef); + video::SColor c1 = encode_light_and_color(l, + tile_liquid.color, f.light_source); + video::SColor c2 = encode_light_and_color(l, + tile_liquid_bfculled.color, f.light_source); bool top_is_same_liquid = false; MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z)); @@ -237,9 +295,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if(ntop.getContent() == c_flowing || ntop.getContent() == c_source) top_is_same_liquid = true; - u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source); - /* Generate sides */ @@ -285,15 +340,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // Use backface culled material if neighbor doesn't have a // solidness of 0 const TileSpec *current_tile = &tile_liquid; - if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) + video::SColor *c = &c1; + if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) { current_tile = &tile_liquid_bfculled; + c = &c2; + } video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,0,BS/2,0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2,0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0), + video::S3DVertex(-BS/2,0,BS/2,0,0,0, *c, 0,1), + video::S3DVertex(BS/2,0,BS/2,0,0,0, *c, 1,1), + video::S3DVertex(BS/2,0,BS/2, 0,0,0, *c, 1,0), + video::S3DVertex(-BS/2,0,BS/2, 0,0,0, *c, 0,0), }; /* @@ -359,10 +417,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0), + video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c1, 0,1), + video::S3DVertex(BS/2,0,BS/2, 0,0,0, c1, 1,1), + video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c1, 1,0), + video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c1, 0,0), }; v3f offset(p.X * BS, (p.Y + 0.5) * BS, p.Z * BS); @@ -380,8 +438,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, /* Add flowing liquid to mesh */ - TileSpec tile_liquid = f.special_tiles[0]; - TileSpec tile_liquid_bfculled = f.special_tiles[1]; + TileSpec tile_liquid = getSpecialTile(f, n, 0); + TileSpec tile_liquid_bfculled = getSpecialTile(f, n, 1); bool top_is_same_liquid = false; MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x,y+1,z)); @@ -404,7 +462,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // Otherwise use the light of this node (the liquid) else l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(f.alpha, l, f.light_source); + video::SColor c1 = encode_light_and_color(l, + tile_liquid.color, f.light_source); + video::SColor c2 = encode_light_and_color(l, + tile_liquid_bfculled.color, f.light_source); u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8); @@ -552,7 +613,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, is liquid, don't draw side face */ if (top_is_same_liquid && - neighbor_data.flags & neighborflag_top_is_same_liquid) + (neighbor_data.flags & neighborflag_top_is_same_liquid)) continue; content_t neighbor_content = neighbor_data.content; @@ -574,15 +635,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // Use backface culled material if neighbor doesn't have a // solidness of 0 const TileSpec *current_tile = &tile_liquid; - if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) + video::SColor *c = &c1; + if(n_feat.solidness != 0 || n_feat.visual_solidness != 0) { current_tile = &tile_liquid_bfculled; + c = &c2; + } video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0), + video::S3DVertex(-BS/2,0,BS/2, 0,0,0, *c, 0,1), + video::S3DVertex(BS/2,0,BS/2, 0,0,0, *c, 1,1), + video::S3DVertex(BS/2,0,BS/2, 0,0,0, *c, 1,0), + video::S3DVertex(-BS/2,0,BS/2, 0,0,0, *c, 0,0), }; /* @@ -656,10 +720,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, { video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,0), + video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c1, 0,1), + video::S3DVertex(BS/2,0,BS/2, 0,0,0, c1, 1,1), + video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c1, 1,0), + video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c1, 0,0), }; // To get backface culling right, the vertices need to go @@ -720,8 +784,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, TileSpec tile = getNodeTile(n, p, v3s16(0,0,0), data); u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); - + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); for(u32 j=0; j<6; j++) { // Check this neighbor @@ -731,13 +795,17 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // Don't make face if neighbor is of same type if(n2.getContent() == n.getContent()) continue; + video::SColor c2=c; + if(!f.light_source) + applyFacesShading(c2, v3f(dir.X, dir.Y, dir.Z)); + // The face at Z+ video::S3DVertex vertices[4] = { - video::S3DVertex(-BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,1), - video::S3DVertex(BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,1), - video::S3DVertex(BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 0,0), - video::S3DVertex(-BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c, 1,0), + video::S3DVertex(-BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c2, 1,1), + video::S3DVertex(BS/2,-BS/2,BS/2, dir.X,dir.Y,dir.Z, c2, 0,1), + video::S3DVertex(BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c2, 0,0), + video::S3DVertex(-BS/2,BS/2,BS/2, dir.X,dir.Y,dir.Z, c2, 1,0), }; // Rotations in the g_6dirs format @@ -784,12 +852,20 @@ void mapblock_mesh_generate_special(MeshMakeData *data, v3s16( 0, 0,-1) }; + u16 l = getInteriorLight(n, 1, nodedef); u8 i; TileSpec tiles[6]; for (i = 0; i < 6; i++) tiles[i] = getNodeTile(n, p, dirs[i], data); + video::SColor tile0color = encode_light_and_color(l, + tiles[0].color, f.light_source); + video::SColor tile0colors[6]; + for (i = 0; i < 6; i++) + tile0colors[i] = tile0color; + TileSpec glass_tiles[6]; + video::SColor glasscolor[6]; if (tiles[1].texture && tiles[2].texture && tiles[3].texture) { glass_tiles[0] = tiles[2]; glass_tiles[1] = tiles[3]; @@ -801,14 +877,15 @@ void mapblock_mesh_generate_special(MeshMakeData *data, for (i = 0; i < 6; i++) glass_tiles[i] = tiles[1]; } + for (i = 0; i < 6; i++) + glasscolor[i] = encode_light_and_color(l, glass_tiles[i].color, + f.light_source); u8 param2 = n.getParam2(); bool H_merge = ! bool(param2 & 128); bool V_merge = ! bool(param2 & 64); param2 = param2 & 63; - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); v3f pos = intToFloat(p, BS); static const float a = BS / 2; static const float g = a - 0.003; @@ -947,7 +1024,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 1-tx2, 1-ty2, 1-tx1, 1-ty1, tx1, 1-ty2, tx2, 1-ty1, }; - makeCuboid(&collector, box, &tiles[0], 1, c, txc1); + makeCuboid(&collector, box, &tiles[0], 1, tile0colors, + txc1, f.light_source); } for(i = 0; i < 6; i++) @@ -971,16 +1049,21 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 1-tx2, 1-ty2, 1-tx1, 1-ty1, tx1, 1-ty2, tx2, 1-ty1, }; - makeCuboid(&collector, box, &glass_tiles[i], 1, c, txc2); + makeCuboid(&collector, box, &glass_tiles[i], 1, glasscolor, + txc2, f.light_source); } if (param2 > 0 && f.special_tiles[0].texture) { // Interior volume level is in range 0 .. 63, // convert it to -0.5 .. 0.5 float vlev = (((float)param2 / 63.0 ) * 2.0 - 1.0); + TileSpec tile=getSpecialTile(f, n, 0); + video::SColor special_color = encode_light_and_color(l, + tile.color, f.light_source); TileSpec interior_tiles[6]; for (i = 0; i < 6; i++) - interior_tiles[i] = f.special_tiles[0]; + interior_tiles[i] = tile; + float offset = 0.003; box = aabb3f(visible_faces[3] ? -b : -a + offset, visible_faces[1] ? -b : -a + offset, @@ -1004,22 +1087,24 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 1-tx2, 1-ty2, 1-tx1, 1-ty1, tx1, 1-ty2, tx2, 1-ty1, }; - makeCuboid(&collector, box, interior_tiles, 6, c, txc3); + makeCuboid(&collector, box, interior_tiles, 6, special_color, + txc3, f.light_source); } break;} case NDT_ALLFACES: { TileSpec tile_leaves = getNodeTile(n, p, v3s16(0,0,0), data); - u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, + tile_leaves.color, f.light_source); v3f pos = intToFloat(p, BS); aabb3f box(-BS/2,-BS/2,-BS/2,BS/2,BS/2,BS/2); box.MinEdge += pos; box.MaxEdge += pos; - makeCuboid(&collector, box, &tile_leaves, 1, c, NULL); + makeCuboid(&collector, box, &tile_leaves, 1, c, NULL, + f.light_source); break;} case NDT_ALLFACES_OPTIONAL: // This is always pre-converted to something else @@ -1046,7 +1131,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); float s = BS/2*f.visual_scale; // Wall at X+ of node @@ -1087,7 +1173,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); float d = (float)BS/16; float s = BS/2*f.visual_scale; @@ -1132,7 +1219,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); float s = BS / 2 * f.visual_scale; // add sqrt(2) visual scale @@ -1302,7 +1390,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); float s = BS / 2 * f.visual_scale; @@ -1437,7 +1526,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile_rot.rotation = 1; u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); const f32 post_rad=(f32)BS/8; const f32 bar_rad=(f32)BS/16; @@ -1456,7 +1546,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 4/16.,0,8/16.,1, 8/16.,0,12/16.,1, 12/16.,0,16/16.,1}; - makeCuboid(&collector, post, &tile_rot, 1, c, postuv); + makeCuboid(&collector, post, &tile_rot, 1, c, postuv, + f.light_source); // Now a section of fence, +X, if there's a post there v3s16 p2 = p; @@ -1477,11 +1568,11 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 0/16.,8/16.,16/16.,10/16., 0/16.,14/16.,16/16.,16/16.}; makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv); + c, xrailuv, f.light_source); bar.MinEdge.Y -= BS/2; bar.MaxEdge.Y -= BS/2; makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv); + c, xrailuv, f.light_source); } // Now a section of fence, +Z, if there's a post there @@ -1503,11 +1594,11 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 6/16.,6/16.,8/16.,8/16., 10/16.,10/16.,12/16.,12/16.}; makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv); + c, zrailuv, f.light_source); bar.MinEdge.Y -= BS/2; bar.MaxEdge.Y -= BS/2; makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv); + c, zrailuv, f.light_source); } break;} case NDT_RAILLIKE: @@ -1616,7 +1707,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY; u16 l = getInteriorLight(n, 0, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + video::SColor c = encode_light_and_color(l, tile.color, + f.light_source); float d = (float)BS/64; float s = BS/2; @@ -1627,10 +1719,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, video::S3DVertex vertices[4] = { - video::S3DVertex(-s, -s+d,-s, 0,0,0, c,0,1), - video::S3DVertex( s, -s+d,-s, 0,0,0, c,1,1), - video::S3DVertex( s, g*s+d, s, 0,0,0, c,1,0), - video::S3DVertex(-s, g*s+d, s, 0,0,0, c,0,0), + video::S3DVertex(-s, -s+d, -s, 0, 0, 0, c, 0, 1), + video::S3DVertex( s, -s+d, -s, 0, 0, 0, c, 1, 1), + video::S3DVertex( s, g*s+d, s, 0, 0, 0, c, 1, 0), + video::S3DVertex(-s, g*s+d, s, 0, 0, 0, c, 0, 0), }; for(s32 i=0; i<4; i++) @@ -1653,10 +1745,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data, v3s16(0, 0, 1), v3s16(0, 0, -1) }; - TileSpec tiles[6]; u16 l = getInteriorLight(n, 1, nodedef); - video::SColor c = MapBlock_LightColor(255, l, f.light_source); + TileSpec tiles[6]; + video::SColor colors[6]; + for(int j = 0; j < 6; j++) { + // Handles facedir rotation for textures + tiles[j] = getNodeTile(n, p, tile_dirs[j], data); + colors[j]= encode_light_and_color(l, tiles[j].color, + f.light_source); + } v3f pos = intToFloat(p, BS); @@ -1696,11 +1794,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, i = boxes.begin(); i != boxes.end(); ++i) { - for(int j = 0; j < 6; j++) - { - // Handles facedir rotation for textures - tiles[j] = getNodeTile(n, p, tile_dirs[j], data); - } aabb3f box = *i; box.MinEdge += pos; box.MaxEdge += pos; @@ -1747,18 +1840,19 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // front tx1, 1-ty2, tx2, 1-ty1, }; - makeCuboid(&collector, box, tiles, 6, c, txc); + makeCuboid(&collector, box, tiles, 6, colors, txc, f.light_source); } break;} case NDT_MESH: { v3f pos = intToFloat(p, BS); - video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source); - + u16 l = getInteriorLight(n, 1, nodedef); u8 facedir = 0; - if (f.param_type_2 == CPT2_FACEDIR) { + if (f.param_type_2 == CPT2_FACEDIR || + f.param_type_2 == CPT2_COLORED_FACEDIR) { facedir = n.getFaceDir(nodedef); - } else if (f.param_type_2 == CPT2_WALLMOUNTED) { + } else if (f.param_type_2 == CPT2_WALLMOUNTED || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { //convert wallmounted to 6dfacedir. //when cache enabled, it is already converted facedir = n.getWallMounted(nodedef); @@ -1771,10 +1865,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if (f.mesh_ptr[facedir]) { // use cached meshes for(u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) { + const TileSpec &tile = getNodeTileN(n, p, j, data); scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j); - collector.append(getNodeTileN(n, p, j, data), - (video::S3DVertex *)buf->getVertices(), buf->getVertexCount(), - buf->getIndices(), buf->getIndexCount(), pos, c); + collector.append(tile, (video::S3DVertex *) + buf->getVertices(), buf->getVertexCount(), + buf->getIndices(), buf->getIndexCount(), pos, + encode_light_and_color(l, tile.color, f.light_source), + f.light_source); } } else if (f.mesh_ptr[0]) { // no cache, clone and rotate mesh @@ -1783,10 +1880,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data, recalculateBoundingBox(mesh); meshmanip->recalculateNormals(mesh, true, false); for(u16 j = 0; j < mesh->getMeshBufferCount(); j++) { + const TileSpec &tile = getNodeTileN(n, p, j, data); scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - collector.append(getNodeTileN(n, p, j, data), - (video::S3DVertex *)buf->getVertices(), buf->getVertexCount(), - buf->getIndices(), buf->getIndexCount(), pos, c); + collector.append(tile, (video::S3DVertex *) + buf->getVertices(), buf->getVertexCount(), + buf->getIndices(), buf->getIndexCount(), pos, + encode_light_and_color(l, tile.color, f.light_source), + f.light_source); } mesh->drop(); } diff --git a/src/game.cpp b/src/game.cpp index 1070cb1b2..07d429c6b 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -642,7 +642,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting m_fog_distance; CachedVertexShaderSetting m_animation_timer_vertex; CachedPixelShaderSetting m_animation_timer_pixel; - CachedPixelShaderSetting m_day_night_ratio; + CachedPixelShaderSetting m_day_light; CachedPixelShaderSetting m_eye_position_pixel; CachedVertexShaderSetting m_eye_position_vertex; CachedPixelShaderSetting m_minimap_yaw; @@ -674,7 +674,7 @@ public: m_fog_distance("fogDistance"), m_animation_timer_vertex("animationTimer"), m_animation_timer_pixel("animationTimer"), - m_day_night_ratio("dayNightRatio"), + m_day_light("dayLight"), m_eye_position_pixel("eyePosition"), m_eye_position_vertex("eyePosition"), m_minimap_yaw("yawVec"), @@ -717,8 +717,14 @@ public: m_fog_distance.set(&fog_distance, services); - float daynight_ratio = (float)m_client->getEnv().getDayNightRatio() / 1000.f; - m_day_night_ratio.set(&daynight_ratio, services); + u32 daynight_ratio = (float)m_client->getEnv().getDayNightRatio(); + video::SColorf sunlight; + get_sunlight_color(&sunlight, daynight_ratio); + float dnc[3] = { + sunlight.r, + sunlight.g, + sunlight.b }; + m_day_light.set(dnc, services); u32 animation_timer = porting::getTimeMs() % 100000; float animation_timer_f = (float)animation_timer / 100000.f; @@ -840,7 +846,8 @@ bool nodePlacementPrediction(Client &client, // Predict param2 for facedir and wallmounted nodes u8 param2 = 0; - if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED) { + if (nodedef->get(id).param_type_2 == CPT2_WALLMOUNTED || + nodedef->get(id).param_type_2 == CPT2_COLORED_WALLMOUNTED) { v3s16 dir = nodepos - neighbourpos; if (abs(dir.Y) > MYMAX(abs(dir.X), abs(dir.Z))) { @@ -852,7 +859,8 @@ bool nodePlacementPrediction(Client &client, } } - if (nodedef->get(id).param_type_2 == CPT2_FACEDIR) { + if (nodedef->get(id).param_type_2 == CPT2_FACEDIR || + nodedef->get(id).param_type_2 == CPT2_COLORED_FACEDIR) { v3s16 dir = nodepos - floatToInt(client.getEnv().getLocalPlayer()->getPosition(), BS); if (abs(dir.X) > abs(dir.Z)) { @@ -3749,11 +3757,9 @@ PointedThing Game::updatePointedThing( light_level = node_light; } - video::SColor c = MapBlock_LightColor(255, light_level, 0); - u8 day = c.getRed(); - u8 night = c.getGreen(); u32 daynight_ratio = client->getEnv().getDayNightRatio(); - finalColorBlend(c, day, night, daynight_ratio); + video::SColor c; + final_color_blend(&c, light_level, daynight_ratio); // Modify final color a bit with time u32 timer = porting::getTimeMs() % 5000; @@ -3964,7 +3970,7 @@ void Game::handleDigging(GameRunData *runData, const ContentFeatures &features = client->getNodeDefManager()->get(n); client->getParticleManager()->addPunchingParticles(client, smgr, - player, nodepos, features.tiles); + player, nodepos, n, features); } } @@ -4011,7 +4017,7 @@ void Game::handleDigging(GameRunData *runData, const ContentFeatures &features = client->getNodeDefManager()->get(wasnode); client->getParticleManager()->addDiggingParticles(client, smgr, - player, nodepos, features.tiles); + player, nodepos, wasnode, features); } runData->dig_time = 0; diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 143adb410..dfd6f55a5 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -32,12 +32,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/directiontables.h" #include -static void applyFacesShading(video::SColor &color, const float factor) -{ - color.setRed(core::clamp(core::round32(color.getRed() * factor), 0, 255)); - color.setGreen(core::clamp(core::round32(color.getGreen() * factor), 0, 255)); -} - /* MeshMakeData */ @@ -321,19 +315,34 @@ u16 getSmoothLight(v3s16 p, v3s16 corner, MeshMakeData *data) return getSmoothLightCombined(p, data); } -/* - Converts from day + night color values (0..255) - and a given daynight_ratio to the final SColor shown on screen. -*/ -void finalColorBlend(video::SColor& result, - u8 day, u8 night, u32 daynight_ratio) -{ - s32 rg = (day * daynight_ratio + night * (1000-daynight_ratio)) / 1000; - s32 b = rg; +void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio){ + f32 rg = daynight_ratio / 1000.0f - 0.04f; + f32 b = (0.98f * daynight_ratio) / 1000.0f + 0.078f; + sunlight->r = rg; + sunlight->g = rg; + sunlight->b = b; +} - // Moonlight is blue - b += (day - night) / 13; - rg -= (day - night) / 23; +void final_color_blend(video::SColor *result, + u16 light, u32 daynight_ratio) +{ + video::SColorf dayLight; + get_sunlight_color(&dayLight, daynight_ratio); + final_color_blend(result, + encode_light_and_color(light, video::SColor(0xFFFFFFFF), 0), dayLight); +} + +void final_color_blend(video::SColor *result, + const video::SColor &data, const video::SColorf &dayLight) +{ + static const video::SColorf artificialColor(1.04f, 1.04f, 1.04f); + + video::SColorf c(data); + f32 n = 1 - c.a; + + f32 r = c.r * (c.a * dayLight.r + n * artificialColor.r) * 2.0f; + f32 g = c.g * (c.a * dayLight.g + n * artificialColor.g) * 2.0f; + f32 b = c.b * (c.a * dayLight.b + n * artificialColor.b) * 2.0f; // Emphase blue a bit in darker places // Each entry of this array represents a range of 8 blue levels @@ -341,19 +350,13 @@ void finalColorBlend(video::SColor& result, 1, 4, 6, 6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - b += emphase_blue_when_dark[irr::core::clamp(b, 0, 255) / 8]; - b = irr::core::clamp(b, 0, 255); - // Artificial light is yellow-ish - static const u8 emphase_yellow_when_artificial[16] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 10, 15, 15, 15 - }; - rg += emphase_yellow_when_artificial[night/16]; - rg = irr::core::clamp(rg, 0, 255); + b += emphase_blue_when_dark[irr::core::clamp((s32) ((r + g + b) / 3 * 255), + 0, 255) / 8] / 255.0f; - result.setRed(rg); - result.setGreen(rg); - result.setBlue(b); + result->setRed(core::clamp((s32) (r * 255.0f), 0, 255)); + result->setGreen(core::clamp((s32) (g * 255.0f), 0, 255)); + result->setBlue(core::clamp((s32) (b * 255.0f), 0, 255)); } /* @@ -430,7 +433,7 @@ struct FastFace }; static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3, - v3f p, v3s16 dir, v3f scale, u8 light_source, std::vector &dest) + v3f p, v3s16 dir, v3f scale, std::vector &dest) { // Position is at the center of the cube. v3f pos = p * BS; @@ -580,24 +583,25 @@ static void makeFastFace(TileSpec tile, u16 li0, u16 li1, u16 li2, u16 li3, v3f normal(dir.X, dir.Y, dir.Z); - u8 alpha = tile.alpha; - dest.push_back(FastFace()); FastFace& face = *dest.rbegin(); - face.vertices[0] = video::S3DVertex(vertex_pos[0], normal, - MapBlock_LightColor(alpha, li0, light_source), - core::vector2d(x0+w*abs_scale, y0+h)); - face.vertices[1] = video::S3DVertex(vertex_pos[1], normal, - MapBlock_LightColor(alpha, li1, light_source), - core::vector2d(x0, y0+h)); - face.vertices[2] = video::S3DVertex(vertex_pos[2], normal, - MapBlock_LightColor(alpha, li2, light_source), - core::vector2d(x0, y0)); - face.vertices[3] = video::S3DVertex(vertex_pos[3], normal, - MapBlock_LightColor(alpha, li3, light_source), - core::vector2d(x0+w*abs_scale, y0)); + u16 li[4] = { li0, li1, li2, li3 }; + v2f32 f[4] = { + core::vector2d(x0 + w * abs_scale, y0 + h), + core::vector2d(x0, y0 + h), + core::vector2d(x0, y0), + core::vector2d(x0 + w * abs_scale, y0) }; + + for (u8 i = 0; i < 4; i++) { + video::SColor c = encode_light_and_color(li[i], tile.color, + tile.emissive_light); + if (!tile.emissive_light) + applyFacesShading(c, normal); + + face.vertices[i] = video::S3DVertex(vertex_pos[i], normal, c, f[i]); + } face.tile = tile; } @@ -664,7 +668,10 @@ static u8 face_contents(content_t m1, content_t m2, bool *equivalent, TileSpec getNodeTileN(MapNode mn, v3s16 p, u8 tileindex, MeshMakeData *data) { INodeDefManager *ndef = data->m_client->ndef(); - TileSpec spec = ndef->get(mn).tiles[tileindex]; + const ContentFeatures &f = ndef->get(mn); + TileSpec spec = f.tiles[tileindex]; + if (!spec.has_color) + mn.getColor(f, &spec.color); // Apply temporary crack if (p == data->m_crack_pos_relative) spec.material_flags |= MATERIAL_FLAG_CRACK; @@ -747,8 +754,7 @@ static void getTileInfo( v3s16 &p_corrected, v3s16 &face_dir_corrected, u16 *lights, - TileSpec &tile, - u8 &light_source + TileSpec &tile ) { VoxelManipulator &vmanip = data->m_vmanip; @@ -763,7 +769,8 @@ static void getTileInfo( return; } - const MapNode &n1 = vmanip.getNodeRefUnsafeCheckFlags(blockpos_nodes + p + face_dir); + const MapNode &n1 = vmanip.getNodeRefUnsafeCheckFlags( + blockpos_nodes + p + face_dir); if (n1.getContent() == CONTENT_IGNORE) { makes_face = false; @@ -783,26 +790,25 @@ static void getTileInfo( makes_face = true; - if(mf == 1) - { - tile = getNodeTile(n0, p, face_dir, data); + MapNode n = n0; + + if (mf == 1) { p_corrected = p; face_dir_corrected = face_dir; - light_source = ndef->get(n0).light_source; - } - else - { - tile = getNodeTile(n1, p + face_dir, -face_dir, data); + } else { + n = n1; p_corrected = p + face_dir; face_dir_corrected = -face_dir; - light_source = ndef->get(n1).light_source; } + tile = getNodeTile(n, p_corrected, face_dir_corrected, data); + const ContentFeatures &f = ndef->get(n); + tile.emissive_light = f.light_source; // eg. water and glass - if(equivalent) + if (equivalent) tile.material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; - if(data->m_smooth_lighting == false) + if (data->m_smooth_lighting == false) { lights[0] = lights[1] = lights[2] = lights[3] = getFaceLight(n0, n1, face_dir, ndef); @@ -845,10 +851,9 @@ static void updateFastFaceRow( v3s16 face_dir_corrected; u16 lights[4] = {0,0,0,0}; TileSpec tile; - u8 light_source = 0; getTileInfo(data, p, face_dir, makes_face, p_corrected, face_dir_corrected, - lights, tile, light_source); + lights, tile); for(u16 j=0; javg("Meshgen: faces drawn by tiling", 0); for(int i = 1; i < continuous_tiles_count; i++){ @@ -958,7 +962,6 @@ static void updateFastFaceRow( lights[2] = next_lights[2]; lights[3] = next_lights[3]; tile = next_tile; - light_source = next_light_source; p = p_next; } } @@ -1083,12 +1086,14 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): const u16 *indices_p = indices; /* - Revert triangles for nicer looking gradient if vertices - 1 and 3 have same color or 0 and 2 have different color. - getRed() is the day color. + Revert triangles for nicer looking gradient if the + brightness of vertices 1 and 3 differ less than + the brightness of vertices 0 and 2. */ - if(f.vertices[0].Color.getRed() != f.vertices[2].Color.getRed() - || f.vertices[1].Color.getRed() == f.vertices[3].Color.getRed()) + if (abs(f.vertices[0].Color.getAverage() + - f.vertices[2].Color.getAverage()) + > abs(f.vertices[1].Color.getAverage() + - f.vertices[3].Color.getAverage())) indices_p = indices_alternate; collector.append(f.tile, f.vertices, 4, indices_p, 6); @@ -1148,43 +1153,30 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): p.tile.texture = animation_frame.texture; } - u32 vertex_count = m_use_tangent_vertices ? - p.tangent_vertices.size() : p.vertices.size(); - for (u32 j = 0; j < vertex_count; j++) { - v3f *Normal; - video::SColor *vc; - if (m_use_tangent_vertices) { - vc = &p.tangent_vertices[j].Color; - Normal = &p.tangent_vertices[j].Normal; - } else { - vc = &p.vertices[j].Color; - Normal = &p.vertices[j].Normal; - } - // Note applyFacesShading second parameter is precalculated sqrt - // value for speed improvement - // Skip it for lightsources and top faces. - if (!vc->getBlue()) { - if (Normal->Y < -0.5) { - applyFacesShading(*vc, 0.447213); - } else if (Normal->X > 0.5) { - applyFacesShading(*vc, 0.670820); - } else if (Normal->X < -0.5) { - applyFacesShading(*vc, 0.670820); - } else if (Normal->Z > 0.5) { - applyFacesShading(*vc, 0.836660); - } else if (Normal->Z < -0.5) { - applyFacesShading(*vc, 0.836660); - } - } - if (!m_enable_shaders) { - // - Classic lighting (shaders handle this by themselves) - // Set initial real color and store for later updates - u8 day = vc->getRed(); - u8 night = vc->getGreen(); - finalColorBlend(*vc, day, night, 1000); - if (day != night) { - m_daynight_diffs[i][j] = std::make_pair(day, night); + if (!m_enable_shaders) { + // Extract colors for day-night animation + // Dummy sunlight to handle non-sunlit areas + video::SColorf sunlight; + get_sunlight_color(&sunlight, 0); + u32 vertex_count = + m_use_tangent_vertices ? + p.tangent_vertices.size() : p.vertices.size(); + for (u32 j = 0; j < vertex_count; j++) { + video::SColor *vc; + if (m_use_tangent_vertices) { + vc = &p.tangent_vertices[j].Color; + } else { + vc = &p.vertices[j].Color; } + video::SColor copy(*vc); + if (vc->getAlpha() == 0) // No sunlight - no need to animate + final_color_blend(vc, copy, sunlight); // Finalize color + else // Record color to animate + m_daynight_diffs[i][j] = copy; + + // The sunlight ratio has been stored, + // delete alpha (for the final rendering). + vc->setAlpha(255); } } @@ -1358,19 +1350,19 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat if (m_enable_vbo) { m_mesh->setDirty(); } - for(std::map > >::iterator + video::SColorf day_color; + get_sunlight_color(&day_color, daynight_ratio); + for(std::map >::iterator i = m_daynight_diffs.begin(); i != m_daynight_diffs.end(); ++i) { scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first); video::S3DVertex *vertices = (video::S3DVertex *)buf->getVertices(); - for(std::map >::iterator + for(std::map::iterator j = i->second.begin(); j != i->second.end(); ++j) { - u8 day = j->second.first; - u8 night = j->second.second; - finalColorBlend(vertices[j->first].Color, day, night, daynight_ratio); + final_color_blend(&(vertices[j->first].Color), j->second, day_color); } } m_last_daynight_ratio = daynight_ratio; @@ -1452,7 +1444,7 @@ void MeshCollector::append(const TileSpec &tile, void MeshCollector::append(const TileSpec &tile, const video::S3DVertex *vertices, u32 numVertices, const u16 *indices, u32 numIndices, - v3f pos, video::SColor c) + v3f pos, video::SColor c, u8 light_source) { if (numIndices > 65535) { dstream<<"FIXME: MeshCollector::append() called with numIndices="<tangent_vertices.size(); for (u32 i = 0; i < numVertices; i++) { + if (!light_source) { + c = original_c; + applyFacesShading(c, vertices[i].Normal); + } video::S3DVertexTangents vert(vertices[i].Pos + pos, vertices[i].Normal, c, vertices[i].TCoords); p->tangent_vertices.push_back(vert); @@ -1489,8 +1486,12 @@ void MeshCollector::append(const TileSpec &tile, } else { vertex_count = p->vertices.size(); for (u32 i = 0; i < numVertices; i++) { - video::S3DVertex vert(vertices[i].Pos + pos, - vertices[i].Normal, c, vertices[i].TCoords); + if (!light_source) { + c = original_c; + applyFacesShading(c, vertices[i].Normal); + } + video::S3DVertex vert(vertices[i].Pos + pos, vertices[i].Normal, c, + vertices[i].TCoords); p->vertices.push_back(vert); } } @@ -1500,3 +1501,33 @@ void MeshCollector::append(const TileSpec &tile, p->indices.push_back(j); } } + +video::SColor encode_light_and_color(u16 light, const video::SColor &color, + u8 emissive_light) +{ + // Get components + f32 day = (light & 0xff) / 255.0f; + f32 night = (light >> 8) / 255.0f; + // Add emissive light + night += emissive_light * 0.01f; + if (night > 255) + night = 255; + // Since we don't know if the day light is sunlight or + // artificial light, assume it is artificial when the night + // light bank is also lit. + if (day < night) + day = 0; + else + day = day - night; + f32 sum = day + night; + // Ratio of sunlight: + float r; + if (sum > 0) + r = day / sum; + else + r = 0; + // Average light: + float b = (day + night) / 2; + return video::SColor(r * 255, b * color.getRed(), b * color.getGreen(), + b * color.getBlue()); +} diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 5adb7df3f..916703f3e 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -156,8 +156,8 @@ private: // Animation info: day/night transitions // Last daynight_ratio value passed to animate() u32 m_last_daynight_ratio; - // For each meshbuffer, maps vertex indices to (day,night) pairs - std::map > > m_daynight_diffs; + // For each meshbuffer, stores pre-baked colors of sunlit vertices + std::map > m_daynight_diffs; // Camera offset info -> do we have to translate the mesh? v3s16 m_camera_offset; @@ -192,28 +192,53 @@ struct MeshCollector void append(const TileSpec &material, const video::S3DVertex *vertices, u32 numVertices, const u16 *indices, u32 numIndices, - v3f pos, video::SColor c); + v3f pos, video::SColor c, u8 light_source); }; -// This encodes -// alpha in the A channel of the returned SColor -// day light (0-255) in the R channel of the returned SColor -// night light (0-255) in the G channel of the returned SColor -// light source (0-255) in the B channel of the returned SColor -inline video::SColor MapBlock_LightColor(u8 alpha, u16 light, u8 light_source=0) -{ - return video::SColor(alpha, (light & 0xff), (light >> 8), light_source); -} +/*! + * Encodes light and color of a node. + * The result is not the final color, but a + * half-baked vertex color. + * + * \param light the first 8 bits are day light, + * the last 8 bits are night light + * \param color the node's color + * \param emissive_light amount of light the surface emits, + * from 0 to LIGHT_SUN. + */ +video::SColor encode_light_and_color(u16 light, const video::SColor &color, + u8 emissive_light); // Compute light at node u16 getInteriorLight(MapNode n, s32 increment, INodeDefManager *ndef); u16 getFaceLight(MapNode n, MapNode n2, v3s16 face_dir, INodeDefManager *ndef); u16 getSmoothLight(v3s16 p, v3s16 corner, MeshMakeData *data); -// Converts from day + night color values (0..255) -// and a given daynight_ratio to the final SColor shown on screen. -void finalColorBlend(video::SColor& result, - u8 day, u8 night, u32 daynight_ratio); +/*! + * Returns the sunlight's color from the current + * day-night ratio. + */ +void get_sunlight_color(video::SColorf *sunlight, u32 daynight_ratio); + +/*! + * Gives the final SColor shown on screen. + * + * \param result output color + * \param light first 8 bits are day light, second 8 bits are + * night light + */ +void final_color_blend(video::SColor *result, + u16 light, u32 daynight_ratio); + +/*! + * Gives the final SColor shown on screen. + * + * \param result output color + * \param data the half-baked vertex color + * \param dayLight color of the sunlight + */ +void final_color_blend(video::SColor *result, + const video::SColor &data, const video::SColorf &dayLight); // Retrieves the TileSpec of a face of a node // Adds MATERIAL_FLAG_CRACK if the node is cracked diff --git a/src/mapnode.cpp b/src/mapnode.cpp index f1a7f3e61..d835daba2 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -55,6 +55,15 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name, param2 = a_param2; } +void MapNode::getColor(const ContentFeatures &f, video::SColor *color) const +{ + if (f.palette) { + *color = (*f.palette)[param2]; + return; + } + *color = f.color; +} + void MapNode::setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f) { // If node doesn't contain light data, ignore this @@ -146,7 +155,8 @@ bool MapNode::getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodem u8 MapNode::getFaceDir(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); - if(f.param_type_2 == CPT2_FACEDIR) + if (f.param_type_2 == CPT2_FACEDIR || + f.param_type_2 == CPT2_COLORED_FACEDIR) return (getParam2() & 0x1F) % 24; return 0; } @@ -154,7 +164,8 @@ u8 MapNode::getFaceDir(INodeDefManager *nodemgr) const u8 MapNode::getWallMounted(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); - if(f.param_type_2 == CPT2_WALLMOUNTED) + if (f.param_type_2 == CPT2_WALLMOUNTED || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED) return getParam2() & 0x07; return 0; } @@ -176,7 +187,7 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) { ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2; - if (cpt2 == CPT2_FACEDIR) { + if (cpt2 == CPT2_FACEDIR || cpt2 == CPT2_COLORED_FACEDIR) { static const u8 rotate_facedir[24 * 4] = { // Table value = rotated facedir // Columns: 0, 90, 180, 270 degrees rotation around vertical axis @@ -216,7 +227,8 @@ void MapNode::rotateAlongYAxis(INodeDefManager *nodemgr, Rotation rot) u8 index = facedir * 4 + rot; param2 &= ~31; param2 |= rotate_facedir[index]; - } else if (cpt2 == CPT2_WALLMOUNTED) { + } else if (cpt2 == CPT2_WALLMOUNTED || + cpt2 == CPT2_COLORED_WALLMOUNTED) { u8 wmountface = (param2 & 7); if (wmountface <= 1) return; diff --git a/src/mapnode.h b/src/mapnode.h index ae0245cfe..9c56a7e17 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -20,9 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef MAPNODE_HEADER #define MAPNODE_HEADER -#include "irrlichttypes.h" -#include "irr_v3d.h" -#include "irr_aabb3d.h" +#include "irrlichttypes_bloated.h" #include "light.h" #include #include @@ -187,6 +185,14 @@ struct MapNode param2 = p; } + /*! + * Returns the color of the node. + * + * \param f content features of this node + * \param color output, contains the node's color. + */ + void getColor(const ContentFeatures &f, video::SColor *color) const; + void setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f); void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr); diff --git a/src/mesh.cpp b/src/mesh.cpp index 50465748c..84689b631 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -33,13 +33,25 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MY_ETLM_READ_ONLY video::ETLM_READ_ONLY #endif -static void applyFacesShading(video::SColor& color, float factor) +inline static void applyShadeFactor(video::SColor& color, float factor) { color.setRed(core::clamp(core::round32(color.getRed()*factor), 0, 255)); color.setGreen(core::clamp(core::round32(color.getGreen()*factor), 0, 255)); color.setBlue(core::clamp(core::round32(color.getBlue()*factor), 0, 255)); } +void applyFacesShading(video::SColor &color, const v3f &normal) +{ + // Many special drawtypes have normals set to 0,0,0 and this + // must result in maximum brightness (no face shadng). + if (normal.Y < -0.5f) + applyShadeFactor (color, 0.447213f); + else if (normal.X > 0.5f || normal.X < -0.5f) + applyShadeFactor (color, 0.670820f); + else if (normal.Z > 0.5f || normal.Z < -0.5f) + applyShadeFactor (color, 0.836660f); +} + scene::IAnimatedMesh* createCubeMesh(v3f scale) { video::SColor c(255,255,255,255); @@ -172,29 +184,18 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color) } } -void shadeMeshFaces(scene::IMesh *mesh) +void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor) { - if (mesh == NULL) - return; - - u32 mc = mesh->getMeshBufferCount(); - for (u32 j = 0; j < mc; j++) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - 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); - video::SColor &vc = vertex->Color; - // Many special drawtypes have normals set to 0,0,0 and this - // must result in maximum brightness (no face shadng). - if (vertex->Normal.Y < -0.5f) - applyFacesShading (vc, 0.447213f); - else if (vertex->Normal.X > 0.5f || vertex->Normal.X < -0.5f) - applyFacesShading (vc, 0.670820f); - else if (vertex->Normal.Z > 0.5f || vertex->Normal.Z < -0.5f) - applyFacesShading (vc, 0.836660f); - } + 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); + video::SColor *vc = &(vertex->Color); + // Reset color + *vc = *buffercolor; + // Apply shading + applyFacesShading(*vc, vertex->Normal); } } diff --git a/src/mesh.h b/src/mesh.h index 10df97015..bcf0d771c 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -23,6 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "nodedef.h" +/*! + * Applies shading to a color based on the surface's + * normal vector. + */ +void applyFacesShading(video::SColor &color, const v3f &normal); + /* Create a new cube mesh. Vertices are at (+-scale.X/2, +-scale.Y/2, +-scale.Z/2). @@ -48,11 +54,7 @@ void translateMesh(scene::IMesh *mesh, v3f vec); */ void setMeshColor(scene::IMesh *mesh, const video::SColor &color); -/* - Shade mesh faces according to their normals -*/ - -void shadeMeshFaces(scene::IMesh *mesh); +void colorizeMeshBuffer(scene::IMeshBuffer *buf, const video::SColor *buffercolor); /* Set the color of all vertices in the mesh. @@ -87,7 +89,7 @@ void rotateMeshYZby (scene::IMesh *mesh, f64 degrees); scene::IMesh* cloneMesh(scene::IMesh *src_mesh); /* - Convert nodeboxes to mesh. + Convert nodeboxes to mesh. Each tile goes into a different buffer. boxes - set of nodeboxes to be converted into cuboids uv_coords[24] - table of texture uv coords for each cuboid face expand - factor by which cuboids will be resized diff --git a/src/minimap.cpp b/src/minimap.cpp index f49adb517..a2e501751 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -144,7 +144,7 @@ MinimapPixel *MinimapUpdateThread::getMinimapPixel(v3s16 pos, if (it != m_blocks_cache.end()) { MinimapMapblock *mmblock = it->second; MinimapPixel *pixel = &mmblock->data[relpos.Z * MAP_BLOCKSIZE + relpos.X]; - if (pixel->id != CONTENT_AIR) { + if (pixel->n.param0 != CONTENT_AIR) { *pixel_height = height + pixel->height; return pixel; } @@ -187,7 +187,7 @@ void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height, bool is_radar) for (s16 x = 0; x < size; x++) for (s16 z = 0; z < size; z++) { - u16 id = CONTENT_AIR; + MapNode n(CONTENT_AIR); MinimapPixel *mmpixel = &data->minimap_scan[x + z * size]; if (!is_radar) { @@ -195,14 +195,14 @@ void MinimapUpdateThread::getMap(v3s16 pos, s16 size, s16 height, bool is_radar) MinimapPixel *cached_pixel = getMinimapPixel(v3s16(p.X + x, p.Y, p.Z + z), height, &pixel_height); if (cached_pixel) { - id = cached_pixel->id; + n = cached_pixel->n; mmpixel->height = pixel_height; } } else { mmpixel->air_count = getAirCount(v3s16(p.X + x, p.Y, p.Z + z), height); } - mmpixel->id = id; + mmpixel->n = n; } } @@ -372,10 +372,21 @@ void Mapper::blitMinimapPixelsToImageSurface( for (s16 z = 0; z < data->map_size; z++) { MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; - video::SColor c = m_ndef->get(mmpixel->id).minimap_color; - c.setAlpha(240); + const ContentFeatures &f = m_ndef->get(mmpixel->n); + const TileDef *tile = &f.tiledef[0]; + // Color of the 0th tile (mostly this is the topmost) + video::SColor tilecolor; + if(tile->has_color) + tilecolor = tile->color; + else + mmpixel->n.getColor(f, &tilecolor); + tilecolor.setRed(tilecolor.getRed() * f.minimap_color.getRed() / 255); + tilecolor.setGreen(tilecolor.getGreen() * f.minimap_color.getGreen() + / 255); + tilecolor.setBlue(tilecolor.getBlue() * f.minimap_color.getBlue() / 255); + tilecolor.setAlpha(240); - map_image->setPixel(x, data->map_size - z - 1, c); + map_image->setPixel(x, data->map_size - z - 1, tilecolor); u32 h = mmpixel->height; heightmap_image->setPixel(x,data->map_size - z - 1, @@ -617,7 +628,7 @@ void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos) MapNode n = vmanip->getNodeNoEx(pos + p); if (!surface_found && n.getContent() != CONTENT_AIR) { mmpixel->height = y; - mmpixel->id = n.getContent(); + mmpixel->n = n; surface_found = true; } else if (n.getContent() == CONTENT_AIR) { air_count++; @@ -625,7 +636,7 @@ void MinimapMapblock::getMinimapNodes(VoxelManipulator *vmanip, v3s16 pos) } if (!surface_found) - mmpixel->id = CONTENT_AIR; + mmpixel->n = MapNode(CONTENT_AIR); mmpixel->air_count = air_count; } diff --git a/src/minimap.h b/src/minimap.h index 743b2bff2..81ed0e49f 100644 --- a/src/minimap.h +++ b/src/minimap.h @@ -52,10 +52,10 @@ struct MinimapModeDef { }; struct MinimapPixel { - u16 id; + //! The topmost node that the minimap displays. + MapNode n; u16 height; u16 air_count; - u16 light; }; struct MinimapMapblock { diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 23c8a665b..a511d169b 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -143,9 +143,12 @@ with this program; if not, write to the Free Software Foundation, Inc., serialization of TileAnimation params changed TAT_SHEET_2D Removed client-sided chat perdiction + PROTOCOL VERSION 30: + New ContentFeatures serialization version + Add node and tile color and palette */ -#define LATEST_PROTOCOL_VERSION 29 +#define LATEST_PROTOCOL_VERSION 30 // Server's supported network protocol range #define SERVER_PROTOCOL_VERSION_MIN 13 diff --git a/src/nodedef.cpp b/src/nodedef.cpp index a4af26e87..98f795c7a 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -189,7 +189,9 @@ void NodeBox::deSerialize(std::istream &is) void TileDef::serialize(std::ostream &os, u16 protocol_version) const { - if (protocol_version >= 29) + if (protocol_version >= 30) + writeU8(os, 4); + else if (protocol_version >= 29) writeU8(os, 3); else if (protocol_version >= 26) writeU8(os, 2); @@ -205,6 +207,14 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const writeU8(os, tileable_horizontal); writeU8(os, tileable_vertical); } + if (protocol_version >= 30) { + writeU8(os, has_color); + if (has_color) { + writeU8(os, color.getRed()); + writeU8(os, color.getGreen()); + writeU8(os, color.getBlue()); + } + } } void TileDef::deSerialize(std::istream &is, const u8 contenfeatures_version, const NodeDrawType drawtype) @@ -218,6 +228,14 @@ void TileDef::deSerialize(std::istream &is, const u8 contenfeatures_version, con tileable_horizontal = readU8(is); tileable_vertical = readU8(is); } + if (version >= 4) { + has_color = readU8(is); + if (has_color) { + color.setRed(readU8(is)); + color.setGreen(readU8(is)); + color.setBlue(readU8(is)); + } + } if ((contenfeatures_version < 8) && ((drawtype == NDT_MESH) || @@ -351,172 +369,222 @@ void ContentFeatures::reset() connects_to.clear(); connects_to_ids.clear(); connect_sides = 0; + color = video::SColor(0xFFFFFFFF); + palette_name = ""; + palette = NULL; } void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const { - if(protocol_version < 24){ + if (protocol_version < 30) { serializeOld(os, protocol_version); return; } - writeU8(os, protocol_version < 27 ? 7 : 8); + // version + writeU8(os, 9); - os<first); + for (ItemGroupList::const_iterator i = groups.begin(); i != groups.end(); + ++i) { + os << serializeString(i->first); writeS16(os, i->second); } + writeU8(os, param_type); + writeU8(os, param_type_2); + + // visual writeU8(os, drawtype); + os << serializeString(mesh); writeF1000(os, visual_scale); writeU8(os, 6); - for(u32 i = 0; i < 6; i++) + for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); writeU8(os, CF_SPECIAL_COUNT); - for(u32 i = 0; i < CF_SPECIAL_COUNT; i++){ + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) { tiledef_special[i].serialize(os, protocol_version); } writeU8(os, alpha); + writeU8(os, color.getRed()); + writeU8(os, color.getGreen()); + writeU8(os, color.getBlue()); + os << serializeString(palette_name); + writeU8(os, waving); + writeU8(os, connect_sides); + writeU16(os, connects_to_ids.size()); + for (std::set::const_iterator i = connects_to_ids.begin(); + i != connects_to_ids.end(); ++i) + writeU16(os, *i); writeU8(os, post_effect_color.getAlpha()); writeU8(os, post_effect_color.getRed()); writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); - writeU8(os, param_type); - if ((protocol_version < 28) && (param_type_2 == CPT2_MESHOPTIONS)) - writeU8(os, CPT2_NONE); - else - writeU8(os, param_type_2); - writeU8(os, is_ground_content); + writeU8(os, leveled); + + // lighting writeU8(os, light_propagates); writeU8(os, sunlight_propagates); + writeU8(os, light_source); + + // map generation + writeU8(os, is_ground_content); + + // interaction writeU8(os, walkable); writeU8(os, pointable); writeU8(os, diggable); writeU8(os, climbable); writeU8(os, buildable_to); - os<::const_iterator i = connects_to_ids.begin(); - i != connects_to_ids.end(); ++i) - writeU16(os, *i); - writeU8(os, connect_sides); + + // legacy + writeU8(os, legacy_facedir_simple); + writeU8(os, legacy_wallmounted); +} + +void ContentFeatures::correctAlpha() +{ + if (alpha == 0 || alpha == 255) + return; + + for (u32 i = 0; i < 6; i++) { + std::stringstream s; + s << tiledef[i].name << "^[noalpha^[opacity:" << ((int)alpha); + tiledef[i].name = s.str(); + } + + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) { + std::stringstream s; + s << tiledef_special[i].name << "^[noalpha^[opacity:" << ((int)alpha); + tiledef_special[i].name = s.str(); + } } void ContentFeatures::deSerialize(std::istream &is) { + // version detection int version = readU8(is); - if (version < 7) { + if (version < 9) { deSerializeOld(is, version); return; - } else if (version > 8) { + } else if (version > 9) { throw SerializationError("unsupported ContentFeatures version"); } + // general name = deSerializeString(is); groups.clear(); u32 groups_size = readU16(is); - for(u32 i = 0; i < groups_size; i++){ + for (u32 i = 0; i < groups_size; i++) { std::string name = deSerializeString(is); int value = readS16(is); groups[name] = value; } - drawtype = (enum NodeDrawType)readU8(is); + param_type = (enum ContentParamType) readU8(is); + param_type_2 = (enum ContentParamType2) readU8(is); + // visual + drawtype = (enum NodeDrawType) readU8(is); + mesh = deSerializeString(is); visual_scale = readF1000(is); - if(readU8(is) != 6) + if (readU8(is) != 6) throw SerializationError("unsupported tile count"); - for(u32 i = 0; i < 6; i++) + for (u32 i = 0; i < 6; i++) tiledef[i].deSerialize(is, version, drawtype); - if(readU8(is) != CF_SPECIAL_COUNT) + if (readU8(is) != CF_SPECIAL_COUNT) throw SerializationError("unsupported CF_SPECIAL_COUNT"); - for(u32 i = 0; i < CF_SPECIAL_COUNT; i++) + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) tiledef_special[i].deSerialize(is, version, drawtype); alpha = readU8(is); + color.setRed(readU8(is)); + color.setGreen(readU8(is)); + color.setBlue(readU8(is)); + palette_name = deSerializeString(is); + waving = readU8(is); + connect_sides = readU8(is); + u16 connects_to_size = readU16(is); + connects_to_ids.clear(); + for (u16 i = 0; i < connects_to_size; i++) + connects_to_ids.insert(readU16(is)); post_effect_color.setAlpha(readU8(is)); post_effect_color.setRed(readU8(is)); post_effect_color.setGreen(readU8(is)); post_effect_color.setBlue(readU8(is)); - param_type = (enum ContentParamType)readU8(is); - param_type_2 = (enum ContentParamType2)readU8(is); - is_ground_content = readU8(is); + leveled = readU8(is); + + // lighting-related light_propagates = readU8(is); sunlight_propagates = readU8(is); + light_source = readU8(is); + light_source = MYMIN(light_source, LIGHT_MAX); + + // map generation + is_ground_content = readU8(is); + + // interaction walkable = readU8(is); pointable = readU8(is); diggable = readU8(is); climbable = readU8(is); buildable_to = readU8(is); - deSerializeString(is); // legacy: used to be metadata_name - liquid_type = (enum LiquidType)readU8(is); + rightclickable = readU8(is); + damage_per_second = readU32(is); + + // liquid + liquid_type = (enum LiquidType) readU8(is); liquid_alternative_flowing = deSerializeString(is); liquid_alternative_source = deSerializeString(is); liquid_viscosity = readU8(is); liquid_renewable = readU8(is); - light_source = readU8(is); - light_source = MYMIN(light_source, LIGHT_MAX); - damage_per_second = readU32(is); + liquid_range = readU8(is); + drowning = readU8(is); + floodable = readU8(is); + + // node boxes node_box.deSerialize(is); selection_box.deSerialize(is); - legacy_facedir_simple = readU8(is); - legacy_wallmounted = readU8(is); + collision_box.deSerialize(is); + + // sounds deSerializeSimpleSoundSpec(sound_footstep, is); deSerializeSimpleSoundSpec(sound_dig, is); deSerializeSimpleSoundSpec(sound_dug, is); - rightclickable = readU8(is); - drowning = readU8(is); - leveled = readU8(is); - liquid_range = readU8(is); - waving = readU8(is); - // If you add anything here, insert it primarily inside the try-catch - // block to not need to increase the version. - try{ - // Stuff below should be moved to correct place in a version that - // otherwise changes the protocol version - mesh = deSerializeString(is); - collision_box.deSerialize(is); - floodable = readU8(is); - u16 connects_to_size = readU16(is); - connects_to_ids.clear(); - for (u16 i = 0; i < connects_to_size; i++) - connects_to_ids.insert(readU16(is)); - connect_sides = readU8(is); - }catch(SerializationError &e) {}; + + // read legacy properties + legacy_facedir_simple = readU8(is); + legacy_wallmounted = readU8(is); } #ifndef SERVER void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef, u32 shader_id, bool use_normal_texture, - bool backface_culling, u8 alpha, u8 material_type) + bool backface_culling, u8 material_type) { tile->shader_id = shader_id; tile->texture = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id); - tile->alpha = alpha; tile->material_type = material_type; // Normal texture and shader flags texture @@ -536,6 +604,13 @@ void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, if (tiledef->tileable_vertical) tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL; + // Color + tile->has_color = tiledef->has_color; + if (tiledef->has_color) + tile->color = tiledef->color; + else + tile->color = color; + // Animation parameters int frame_count = 1; if (tile->material_flags & MATERIAL_FLAG_ANIMATION) { @@ -681,6 +756,9 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc is_water_surface = true; } + // Vertex alpha is no longer supported, correct if necessary. + correctAlpha(); + u32 tile_shader[6]; for (u16 j = 0; j < 6; j++) { tile_shader[j] = shdsrc->getShader("nodes_shader", @@ -696,14 +774,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc for (u16 j = 0; j < 6; j++) { fillTileAttribs(tsrc, &tiles[j], &tdef[j], tile_shader[j], tsettings.use_normal_texture, - tiledef[j].backface_culling, alpha, material_type); + tiledef[j].backface_culling, material_type); } // Special tiles (fill in f->special_tiles[]) for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) { fillTileAttribs(tsrc, &special_tiles[j], &tiledef_special[j], tile_shader[j], tsettings.use_normal_texture, - tiledef_special[j].backface_culling, alpha, material_type); + tiledef_special[j].backface_culling, material_type); } if ((drawtype == NDT_MESH) && (mesh != "")) { @@ -731,15 +809,19 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc } //Cache 6dfacedir and wallmounted rotated clones of meshes - if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_FACEDIR)) { + if (tsettings.enable_mesh_cache && mesh_ptr[0] && + (param_type_2 == CPT2_FACEDIR + || param_type_2 == CPT2_COLORED_FACEDIR)) { for (u16 j = 1; j < 24; j++) { mesh_ptr[j] = cloneMesh(mesh_ptr[0]); rotateMeshBy6dFacedir(mesh_ptr[j], j); recalculateBoundingBox(mesh_ptr[j]); meshmanip->recalculateNormals(mesh_ptr[j], true, false); } - } else if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_WALLMOUNTED)) { - static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2}; + } else if (tsettings.enable_mesh_cache && mesh_ptr[0] + && (param_type_2 == CPT2_WALLMOUNTED || + param_type_2 == CPT2_COLORED_WALLMOUNTED)) { + static const u8 wm_to_6d[6] = { 20, 0, 16 + 1, 12 + 3, 8, 4 + 2 }; for (u16 j = 1; j < 6; j++) { mesh_ptr[j] = cloneMesh(mesh_ptr[0]); rotateMeshBy6dFacedir(mesh_ptr[j], wm_to_6d[j]); @@ -775,6 +857,9 @@ public: virtual void removeNode(const std::string &name); virtual void updateAliases(IItemDefManager *idef); virtual void applyTextureOverrides(const std::string &override_filepath); + //! Returns a palette or NULL if not found. Only on client. + std::vector *getPalette(const ContentFeatures &f, + const IGameDef *gamedef); virtual void updateTextures(IGameDef *gamedef, void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress), void *progress_cbk_args); @@ -823,6 +908,9 @@ private: // Next possibly free id content_t m_next_id; + // Maps image file names to loaded palettes. + UNORDERED_MAP > m_palettes; + // NodeResolvers to callback once node registration has ended std::vector m_pending_resolve_callbacks; @@ -1062,7 +1150,8 @@ void getNodeBoxUnion(const NodeBox &nodebox, const ContentFeatures &features, if (nodebox.type == NODEBOX_LEVELED) { half_processed.MaxEdge.Y = +BS / 2; } - if (features.param_type_2 == CPT2_FACEDIR) { + if (features.param_type_2 == CPT2_FACEDIR || + features.param_type_2 == CPT2_COLORED_FACEDIR) { // Get maximal coordinate f32 coords[] = { fabsf(half_processed.MinEdge.X), @@ -1309,6 +1398,78 @@ void CNodeDefManager::applyTextureOverrides(const std::string &override_filepath } } +std::vector *CNodeDefManager::getPalette( + const ContentFeatures &f, const IGameDef *gamedef) +{ +#ifndef SERVER + // This works because colors always use the most significant bits + // of param2. If you add a new colored type which uses param2 + // in a more advanced way, you should change this code, too. + u32 palette_pixels = 0; + switch (f.param_type_2) { + case CPT2_COLOR: + palette_pixels = 256; + break; + case CPT2_COLORED_FACEDIR: + palette_pixels = 8; + break; + case CPT2_COLORED_WALLMOUNTED: + palette_pixels = 32; + break; + default: + return NULL; + } + // This many param2 values will have the same color + u32 step = 256 / palette_pixels; + const std::string &name = f.palette_name; + if (name == "") + return NULL; + Client *client = (Client *) gamedef; + ITextureSource *tsrc = client->tsrc(); + + UNORDERED_MAP >::iterator it = + m_palettes.find(name); + if (it == m_palettes.end()) { + // Create palette + if (!tsrc->isKnownSourceImage(name)) { + warningstream << "CNodeDefManager::getPalette(): palette \"" << name + << "\" could not be loaded." << std::endl; + return NULL; + } + video::IImage *img = tsrc->generateImage(name); + std::vector new_palette; + u32 w = img->getDimension().Width; + u32 h = img->getDimension().Height; + // Real area of the image + u32 area = h * w; + if (area != palette_pixels) + warningstream << "CNodeDefManager::getPalette(): the " + << "specified palette image \"" << name << "\" does not " + << "contain exactly " << palette_pixels + << " pixels." << std::endl; + if (area > palette_pixels) + area = palette_pixels; + // For each pixel in the image + for (u32 i = 0; i < area; i++) { + video::SColor c = img->getPixel(i % w, i / w); + // Fill in palette with 'step' colors + for (u32 j = 0; j < step; j++) + new_palette.push_back(c); + } + img->drop(); + // Fill in remaining elements + while (new_palette.size() < 256) + new_palette.push_back(video::SColor(0xFFFFFFFF)); + m_palettes[name] = new_palette; + it = m_palettes.find(name); + } + if (it != m_palettes.end()) + return &((*it).second); + +#endif + return NULL; +} + void CNodeDefManager::updateTextures(IGameDef *gamedef, void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress), void *progress_callback_args) @@ -1325,10 +1486,13 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef, TextureSettings tsettings; tsettings.readSettings(); + m_palettes.clear(); u32 size = m_content_features.size(); for (u32 i = 0; i < size; i++) { - m_content_features[i].updateTextures(tsrc, shdsrc, meshmanip, client, tsettings); + ContentFeatures *f = &(m_content_features[i]); + f->palette = getPalette(*f, gamedef); + f->updateTextures(tsrc, shdsrc, meshmanip, client, tsettings); progress_callback(progress_callback_args, i, size); } #endif @@ -1429,6 +1593,19 @@ IWritableNodeDefManager *createNodeDefManager() //// Serialization of old ContentFeatures formats void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const { + u8 compatible_param_type_2 = param_type_2; + if ((protocol_version < 28) + && (compatible_param_type_2 == CPT2_MESHOPTIONS)) + compatible_param_type_2 = CPT2_NONE; + else if (protocol_version < 30) { + if (compatible_param_type_2 == CPT2_COLOR) + compatible_param_type_2 = CPT2_NONE; + else if (compatible_param_type_2 == CPT2_COLORED_FACEDIR) + compatible_param_type_2 = CPT2_FACEDIR; + else if (compatible_param_type_2 == CPT2_COLORED_WALLMOUNTED) + compatible_param_type_2 = CPT2_WALLMOUNTED; + } + if (protocol_version == 13) { writeU8(os, 5); // version @@ -1454,7 +1631,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); writeU8(os, param_type); - writeU8(os, param_type_2); + writeU8(os, compatible_param_type_2); writeU8(os, is_ground_content); writeU8(os, light_propagates); writeU8(os, sunlight_propagates); @@ -1483,9 +1660,9 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const os<first); - writeS16(os, i->second); + i = groups.begin(); i != groups.end(); ++i) { + os<first); + writeS16(os, i->second); } writeU8(os, drawtype); writeF1000(os, visual_scale); @@ -1502,7 +1679,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); writeU8(os, param_type); - writeU8(os, param_type_2); + writeU8(os, compatible_param_type_2); writeU8(os, is_ground_content); writeU8(os, light_propagates); writeU8(os, sunlight_propagates); @@ -1530,6 +1707,68 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeU8(os, drowning); writeU8(os, leveled); writeU8(os, liquid_range); + } + else if(protocol_version >= 24 && protocol_version < 30) { + writeU8(os, protocol_version < 27 ? 7 : 8); + + os << serializeString(name); + writeU16(os, groups.size()); + for (ItemGroupList::const_iterator i = groups.begin(); + i != groups.end(); ++i) { + os << serializeString(i->first); + writeS16(os, i->second); + } + writeU8(os, drawtype); + writeF1000(os, visual_scale); + writeU8(os, 6); + for (u32 i = 0; i < 6; i++) + tiledef[i].serialize(os, protocol_version); + writeU8(os, CF_SPECIAL_COUNT); + for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) + tiledef_special[i].serialize(os, protocol_version); + writeU8(os, alpha); + writeU8(os, post_effect_color.getAlpha()); + writeU8(os, post_effect_color.getRed()); + writeU8(os, post_effect_color.getGreen()); + writeU8(os, post_effect_color.getBlue()); + writeU8(os, param_type); + writeU8(os, compatible_param_type_2); + writeU8(os, is_ground_content); + writeU8(os, light_propagates); + writeU8(os, sunlight_propagates); + writeU8(os, walkable); + writeU8(os, pointable); + writeU8(os, diggable); + writeU8(os, climbable); + writeU8(os, buildable_to); + os << serializeString(""); // legacy: used to be metadata_name + writeU8(os, liquid_type); + os << serializeString(liquid_alternative_flowing); + os << serializeString(liquid_alternative_source); + writeU8(os, liquid_viscosity); + writeU8(os, liquid_renewable); + writeU8(os, light_source); + writeU32(os, damage_per_second); + node_box.serialize(os, protocol_version); + selection_box.serialize(os, protocol_version); + writeU8(os, legacy_facedir_simple); + writeU8(os, legacy_wallmounted); + serializeSimpleSoundSpec(sound_footstep, os); + serializeSimpleSoundSpec(sound_dig, os); + serializeSimpleSoundSpec(sound_dug, os); + writeU8(os, rightclickable); + writeU8(os, drowning); + writeU8(os, leveled); + writeU8(os, liquid_range); + writeU8(os, waving); + os << serializeString(mesh); + collision_box.serialize(os, protocol_version); + writeU8(os, floodable); + writeU16(os, connects_to_ids.size()); + for (std::set::const_iterator i = connects_to_ids.begin(); + i != connects_to_ids.end(); ++i) + writeU16(os, *i); + writeU8(os, connect_sides); } else throw SerializationError("ContentFeatures::serialize(): " "Unsupported version requested"); @@ -1642,7 +1881,73 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version) drowning = readU8(is); leveled = readU8(is); liquid_range = readU8(is); - } else { + } else if (version == 7 || version == 8){ + name = deSerializeString(is); + groups.clear(); + u32 groups_size = readU16(is); + for (u32 i = 0; i < groups_size; i++) { + std::string name = deSerializeString(is); + int value = readS16(is); + groups[name] = value; + } + drawtype = (enum NodeDrawType) readU8(is); + + visual_scale = readF1000(is); + if (readU8(is) != 6) + throw SerializationError("unsupported tile count"); + for (u32 i = 0; i < 6; i++) + tiledef[i].deSerialize(is, version, drawtype); + 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, version, drawtype); + alpha = readU8(is); + post_effect_color.setAlpha(readU8(is)); + post_effect_color.setRed(readU8(is)); + post_effect_color.setGreen(readU8(is)); + post_effect_color.setBlue(readU8(is)); + param_type = (enum ContentParamType) readU8(is); + param_type_2 = (enum ContentParamType2) readU8(is); + is_ground_content = readU8(is); + light_propagates = readU8(is); + sunlight_propagates = readU8(is); + walkable = readU8(is); + pointable = readU8(is); + diggable = readU8(is); + climbable = readU8(is); + buildable_to = readU8(is); + deSerializeString(is); // legacy: used to be metadata_name + liquid_type = (enum LiquidType) readU8(is); + liquid_alternative_flowing = deSerializeString(is); + liquid_alternative_source = deSerializeString(is); + liquid_viscosity = readU8(is); + liquid_renewable = readU8(is); + light_source = readU8(is); + light_source = MYMIN(light_source, LIGHT_MAX); + damage_per_second = readU32(is); + node_box.deSerialize(is); + selection_box.deSerialize(is); + legacy_facedir_simple = readU8(is); + legacy_wallmounted = readU8(is); + deSerializeSimpleSoundSpec(sound_footstep, is); + deSerializeSimpleSoundSpec(sound_dig, is); + deSerializeSimpleSoundSpec(sound_dug, is); + rightclickable = readU8(is); + drowning = readU8(is); + leveled = readU8(is); + liquid_range = readU8(is); + waving = readU8(is); + try { + mesh = deSerializeString(is); + collision_box.deSerialize(is); + floodable = readU8(is); + u16 connects_to_size = readU16(is); + connects_to_ids.clear(); + for (u16 i = 0; i < connects_to_size; i++) + connects_to_ids.insert(readU16(is)); + connect_sides = readU8(is); + } catch (SerializationError &e) {}; + }else{ throw SerializationError("unsupported ContentFeatures version"); } } @@ -1736,19 +2041,23 @@ bool CNodeDefManager::nodeboxConnects(MapNode from, MapNode to, u8 connect_face) // does to node declare usable faces? if (f2.connect_sides > 0) { - if ((f2.param_type_2 == CPT2_FACEDIR) && (connect_face >= 4)) { - static const u8 rot[33 * 4] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 32, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 - back - 8, 4, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 - right - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 8, 4, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - front - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 16, 8, 4 // 32 - left - }; - return (f2.connect_sides & rot[(connect_face * 4) + to.param2]); + if ((f2.param_type_2 == CPT2_FACEDIR || + f2.param_type_2 == CPT2_COLORED_FACEDIR) + && (connect_face >= 4)) { + static const u8 rot[33 * 4] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 32, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 4 - back + 8, 4, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 8 - right + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 8, 4, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, // 16 - front + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 16, 8, 4 // 32 - left + }; + return (f2.connect_sides + & rot[(connect_face * 4) + (to.param2 & 0x1F)]); } return (f2.connect_sides & connect_face); } diff --git a/src/nodedef.h b/src/nodedef.h index 183b95d87..6275b41ce 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -68,7 +68,13 @@ enum ContentParamType2 // 2D rotation for things like plants CPT2_DEGROTATE, // Mesh options for plants - CPT2_MESHOPTIONS + CPT2_MESHOPTIONS, + // Index for palette + CPT2_COLOR, + // 3 bits of palette index, then facedir + CPT2_COLORED_FACEDIR, + // 5 bits of palette index, then wallmounted + CPT2_COLORED_WALLMOUNTED }; enum LiquidType @@ -170,6 +176,11 @@ struct TileDef bool backface_culling; // Takes effect only in special cases bool tileable_horizontal; bool tileable_vertical; + //! If true, the tile has its own color. + bool has_color; + //! The color of the tile. + video::SColor color; + struct TileAnimationParams animation; TileDef() @@ -178,6 +189,8 @@ struct TileDef backface_culling = true; tileable_horizontal = true; tileable_vertical = true; + has_color = false; + color = video::SColor(0xFFFFFFFF); animation.type = TAT_NONE; } @@ -191,7 +204,7 @@ struct ContentFeatures { /* Cached stuff - */ + */ #ifndef SERVER // 0 1 2 3 4 5 // up down right left back front @@ -211,12 +224,19 @@ struct ContentFeatures /* Actual data - */ + */ + + // --- GENERAL PROPERTIES --- std::string name; // "" = undefined node ItemGroupList groups; // Same as in itemdef + // Type of MapNode::param1 + ContentParamType param_type; + // Type of MapNode::param2 + ContentParamType2 param_type_2; + + // --- VISUAL PROPERTIES --- - // Visual definition enum NodeDrawType drawtype; std::string mesh; #ifndef SERVER @@ -226,19 +246,38 @@ struct ContentFeatures float visual_scale; // Misc. scale parameter TileDef tiledef[6]; TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid + // If 255, the node is opaque. + // Otherwise it uses texture alpha. u8 alpha; - + // The color of the node. + video::SColor color; + std::string palette_name; + std::vector *palette; + // Used for waving leaves/plants + u8 waving; + // for NDT_CONNECTED pairing + u8 connect_sides; + std::vector connects_to; + std::set connects_to_ids; // Post effect color, drawn when the camera is inside the node. video::SColor post_effect_color; + // Flowing liquid or snow, value = default level + u8 leveled; + + // --- LIGHTING-RELATED --- - // Type of MapNode::param1 - ContentParamType param_type; - // Type of MapNode::param2 - ContentParamType2 param_type_2; - // True for all ground-like things like stone and mud, false for eg. trees - bool is_ground_content; bool light_propagates; bool sunlight_propagates; + // Amount of light the node emits + u8 light_source; + + // --- MAP GENERATION --- + + // True for all ground-like things like stone and mud, false for eg. trees + bool is_ground_content; + + // --- INTERACTION PROPERTIES --- + // This is used for collision detection. // Also for general solidness queries. bool walkable; @@ -250,12 +289,12 @@ 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 - u8 leveled; + u32 damage_per_second; + + // --- LIQUID PROPERTIES --- + // Whether the node is non-liquid, source liquid or flowing liquid enum LiquidType liquid_type; // If the content is liquid, this is the flowing version of the liquid. @@ -271,29 +310,28 @@ struct ContentFeatures // Number of flowing liquids surrounding source u8 liquid_range; u8 drowning; - // Amount of light the node emits - u8 light_source; - u32 damage_per_second; + // Liquids flow into and replace node + bool floodable; + + // --- NODEBOXES --- + NodeBox node_box; NodeBox selection_box; NodeBox collision_box; - // Used for waving leaves/plants - u8 waving; + + // --- SOUND PROPERTIES --- + + SimpleSoundSpec sound_footstep; + SimpleSoundSpec sound_dig; + SimpleSoundSpec sound_dug; + + // --- LEGACY --- + // Compatibility with old maps // Set to true if paramtype used to be 'facedir_simple' bool legacy_facedir_simple; // Set to true if wall_mounted used to be set to true bool legacy_wallmounted; - // for NDT_CONNECTED pairing - u8 connect_sides; - - // Sound properties - SimpleSoundSpec sound_footstep; - SimpleSoundSpec sound_dig; - SimpleSoundSpec sound_dug; - - std::vector connects_to; - std::set connects_to_ids; /* Methods @@ -306,6 +344,14 @@ struct ContentFeatures void deSerialize(std::istream &is); void serializeOld(std::ostream &os, u16 protocol_version) const; void deSerializeOld(std::istream &is, int version); + /*! + * Since vertex alpha is no lnger supported, this method + * adds instructions to the texture names to blend alpha there. + * + * tiledef, tiledef_special and alpha must be initialized + * before calling this. + */ + void correctAlpha(); /* Some handy methods @@ -321,7 +367,7 @@ struct ContentFeatures #ifndef SERVER void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef, u32 shader_id, bool use_normal_texture, bool backface_culling, - u8 alpha, u8 material_type); + u8 material_type); void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings); #endif diff --git a/src/particles.cpp b/src/particles.cpp index 5f17763e0..e1f292fb6 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -56,7 +56,8 @@ Particle::Particle( v2f texpos, v2f texsize, const struct TileAnimationParams &anim, - u8 glow + u8 glow, + video::SColor color ): scene::ISceneNode(smgr->getRootSceneNode(), smgr) { @@ -77,6 +78,10 @@ Particle::Particle( m_animation_frame = 0; m_animation_time = 0.0; + // Color + m_base_color = color; + m_color = color; + // Particle related m_pos = pos; m_velocity = velocity; @@ -183,12 +188,15 @@ void Particle::updateLight() else light = blend_light(m_env->getDayNightRatio(), LIGHT_SUN, 0); - m_light = decode_light(light + m_glow); + u8 m_light = decode_light(light + m_glow); + m_color.set(255, + m_light * m_base_color.getRed() / 255, + m_light * m_base_color.getGreen() / 255, + m_light * m_base_color.getBlue() / 255); } void Particle::updateVertices() { - video::SColor c(255, m_light, m_light, m_light); f32 tx0, tx1, ty0, ty1; if (m_animation.type != TAT_NONE) { @@ -210,14 +218,14 @@ void Particle::updateVertices() ty1 = m_texpos.Y + m_texsize.Y; } - m_vertices[0] = video::S3DVertex(-m_size/2,-m_size/2,0, 0,0,0, - c, tx0, ty1); - m_vertices[1] = video::S3DVertex(m_size/2,-m_size/2,0, 0,0,0, - c, tx1, ty1); - m_vertices[2] = video::S3DVertex(m_size/2,m_size/2,0, 0,0,0, - c, tx1, ty0); - m_vertices[3] = video::S3DVertex(-m_size/2,m_size/2,0, 0,0,0, - c, tx0, ty0); + m_vertices[0] = video::S3DVertex(-m_size / 2, -m_size / 2, + 0, 0, 0, 0, m_color, tx0, ty1); + m_vertices[1] = video::S3DVertex(m_size / 2, -m_size / 2, + 0, 0, 0, 0, m_color, tx1, ty1); + m_vertices[2] = video::S3DVertex(m_size / 2, m_size / 2, + 0, 0, 0, 0, m_color, tx1, ty0); + m_vertices[3] = video::S3DVertex(-m_size / 2, m_size / 2, + 0, 0, 0, 0, m_color, tx0, ty0); v3s16 camera_offset = m_env->getCameraOffset(); for(u16 i=0; i<4; i++) @@ -589,35 +597,39 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, } } -void ParticleManager::addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addDiggingParticles(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { for (u16 j = 0; j < 32; j++) // set the amount of particles here { - addNodeParticle(gamedef, smgr, player, pos, tiles); + addNodeParticle(gamedef, smgr, player, pos, n, f); } } -void ParticleManager::addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addPunchingParticles(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { - addNodeParticle(gamedef, smgr, player, pos, tiles); + addNodeParticle(gamedef, smgr, player, pos, n, f); } -void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]) +void ParticleManager::addNodeParticle(IGameDef* gamedef, + scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f) { // Texture u8 texid = myrand_range(0, 5); + const TileSpec &tile = f.tiles[texid]; video::ITexture *texture; struct TileAnimationParams anim; anim.type = TAT_NONE; // Only use first frame of animated texture - if (tiles[texid].material_flags & MATERIAL_FLAG_ANIMATION) - texture = tiles[texid].frames[0].texture; + if (tile.material_flags & MATERIAL_FLAG_ANIMATION) + texture = tile.frames[0].texture; else - texture = tiles[texid].texture; + texture = tile.texture; float size = rand() % 64 / 512.; float visual_size = BS * size; @@ -638,6 +650,12 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s (f32) pos.Z + rand() %100 /200. - 0.25 ); + video::SColor color; + if (tile.has_color) + color = tile.color; + else + n.getColor(f, &color); + Particle* toadd = new Particle( gamedef, smgr, @@ -655,7 +673,8 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s texpos, texsize, anim, - 0); + 0, + color); addParticle(toadd); } diff --git a/src/particles.h b/src/particles.h index 5464e6672..3177f2cfd 100644 --- a/src/particles.h +++ b/src/particles.h @@ -32,6 +32,8 @@ with this program; if not, write to the Free Software Foundation, Inc., struct ClientEvent; class ParticleManager; class ClientEnvironment; +class MapNode; +class ContentFeatures; class Particle : public scene::ISceneNode { @@ -53,7 +55,8 @@ class Particle : public scene::ISceneNode v2f texpos, v2f texsize, const struct TileAnimationParams &anim, - u8 glow + u8 glow, + video::SColor color = video::SColor(0xFFFFFFFF) ); ~Particle(); @@ -100,7 +103,10 @@ private: v3f m_acceleration; LocalPlayer *m_player; float m_size; - u8 m_light; + //! Color without lighting + video::SColor m_base_color; + //! Final rendered color + video::SColor m_color; bool m_collisiondetection; bool m_collision_removal; bool m_vertical; @@ -184,13 +190,16 @@ public: scene::ISceneManager* smgr, LocalPlayer *player); void addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); void addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr, - LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); + LocalPlayer *player, v3s16 pos, const MapNode &n, + const ContentFeatures &f); protected: void addParticle(Particle* toadd); diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 84af4583b..ebc951295 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -332,6 +332,10 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) L, index, "tileable_horizontal", default_tiling); tiledef.tileable_vertical = getboolfield_default( L, index, "tileable_vertical", default_tiling); + // color = ... + lua_getfield(L, index, "color"); + tiledef.has_color = read_color(L, -1, &tiledef.color); + lua_pop(L, 1); // animation = {} lua_getfield(L, index, "animation"); tiledef.animation = read_animation_definition(L, -1); @@ -450,6 +454,13 @@ ContentFeatures read_content_features(lua_State *L, int index) if (usealpha) f.alpha = 0; + // Read node color. + lua_getfield(L, index, "color"); + read_color(L, -1, &f.color); + lua_pop(L, 1); + + getstringfield(L, index, "palette", f.palette_name); + /* Other stuff */ lua_getfield(L, index, "post_effect_color"); @@ -461,6 +472,13 @@ ContentFeatures read_content_features(lua_State *L, int index) f.param_type_2 = (ContentParamType2)getenumfield(L, index, "paramtype2", ScriptApiNode::es_ContentParamType2, CPT2_NONE); + if (f.palette_name != "" && + !(f.param_type_2 == CPT2_COLOR || + f.param_type_2 == CPT2_COLORED_FACEDIR || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED)) + warningstream << "Node " << f.name.c_str() + << " has a palette, but not a suitable paramtype2." << std::endl; + // Warn about some deprecated fields warn_if_field_exists(L, index, "wall_mounted", "Deprecated; use paramtype2 = 'wallmounted'"); diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp index 379ed773f..23c8f43b9 100644 --- a/src/script/cpp_api/s_node.cpp +++ b/src/script/cpp_api/s_node.cpp @@ -59,6 +59,9 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] = {CPT2_LEVELED, "leveled"}, {CPT2_DEGROTATE, "degrotate"}, {CPT2_MESHOPTIONS, "meshoptions"}, + {CPT2_COLOR, "color"}, + {CPT2_COLORED_FACEDIR, "colorfacedir"}, + {CPT2_COLORED_WALLMOUNTED, "colorwallmounted"}, {0, NULL}, }; diff --git a/src/shader.cpp b/src/shader.cpp index c0ecf738d..79485025b 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -543,7 +543,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype, shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_TRANSPARENT: - shaderinfo.base_material = video::EMT_TRANSPARENT_VERTEX_ALPHA; + shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL; break; case TILE_MATERIAL_LIQUID_OPAQUE: shaderinfo.base_material = video::EMT_SOLID; diff --git a/src/wieldmesh.cpp b/src/wieldmesh.cpp index c305238fe..089a67f33 100644 --- a/src/wieldmesh.cpp +++ b/src/wieldmesh.cpp @@ -318,6 +318,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client) u32 shader_id = shdrsrc->getShader("wielded_shader", TILE_MATERIAL_BASIC, NDT_NORMAL); m_material_type = shdrsrc->getShaderInfo(shader_id).material; } + m_colors.clear(); // If wield_image is defined, it overrides everything else if (def.wield_image != "") { @@ -358,28 +359,30 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client) material_count = 6; } for (u32 i = 0; i < material_count; ++i) { + const TileSpec *tile = &(f.tiles[i]); video::SMaterial &material = m_meshnode->getMaterial(i); material.setFlag(video::EMF_BACK_FACE_CULLING, true); material.setFlag(video::EMF_BILINEAR_FILTER, m_bilinear_filter); material.setFlag(video::EMF_TRILINEAR_FILTER, m_trilinear_filter); - bool animated = (f.tiles[i].animation_frame_count > 1); + bool animated = (tile->animation_frame_count > 1); if (animated) { - FrameSpec animation_frame = f.tiles[i].frames[0]; + FrameSpec animation_frame = tile->frames[0]; material.setTexture(0, animation_frame.texture); } else { - material.setTexture(0, f.tiles[i].texture); + material.setTexture(0, tile->texture); } + m_colors.push_back(tile->color); material.MaterialType = m_material_type; if (m_enable_shaders) { - if (f.tiles[i].normal_texture) { + if (tile->normal_texture) { if (animated) { - FrameSpec animation_frame = f.tiles[i].frames[0]; + FrameSpec animation_frame = tile->frames[0]; material.setTexture(1, animation_frame.normal_texture); } else { - material.setTexture(1, f.tiles[i].normal_texture); + material.setTexture(1, tile->normal_texture); } } - material.setTexture(2, f.tiles[i].flags_texture); + material.setTexture(2, tile->flags_texture); } } return; @@ -393,11 +396,28 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client) changeToMesh(NULL); } -void WieldMeshSceneNode::setColor(video::SColor color) +void WieldMeshSceneNode::setColor(video::SColor c) { assert(!m_lighting); - setMeshColor(m_meshnode->getMesh(), color); - shadeMeshFaces(m_meshnode->getMesh()); + scene::IMesh *mesh=m_meshnode->getMesh(); + if (mesh == NULL) + return; + + u8 red = c.getRed(); + u8 green = c.getGreen(); + u8 blue = c.getBlue(); + u32 mc = mesh->getMeshBufferCount(); + for (u32 j = 0; j < mc; j++) { + video::SColor bc(0xFFFFFFFF); + if (m_colors.size() > j) + bc = m_colors[j]; + video::SColor buffercolor(255, + bc.getRed() * red / 255, + bc.getGreen() * green / 255, + bc.getBlue() * blue / 255); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); + colorizeMeshBuffer(buf, &buffercolor); + } } void WieldMeshSceneNode::render() @@ -464,7 +484,6 @@ scene::IMesh *getItemMesh(Client *client, const ItemStack &item) } else if (f.drawtype == NDT_PLANTLIKE) { mesh = getExtrudedMesh(tsrc, tsrc->getTextureName(f.tiles[0].texture_id)); - return mesh; } else if (f.drawtype == NDT_NORMAL || f.drawtype == NDT_ALLFACES || f.drawtype == NDT_LIQUID || f.drawtype == NDT_FLOWINGLIQUID) { mesh = cloneMesh(g_extrusion_mesh_cache->createCube()); @@ -477,8 +496,6 @@ scene::IMesh *getItemMesh(Client *client, const ItemStack &item) mesh = cloneMesh(mapblock_mesh.getMesh()); translateMesh(mesh, v3f(-BS, -BS, -BS)); scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); - rotateMeshXZby(mesh, -45); - rotateMeshYZby(mesh, -30); u32 mc = mesh->getMeshBufferCount(); for (u32 i = 0; i < mc; ++i) { @@ -492,28 +509,29 @@ scene::IMesh *getItemMesh(Client *client, const ItemStack &item) material1.setTexture(3, material2.getTexture(3)); material1.MaterialType = material2.MaterialType; } - return mesh; } - shadeMeshFaces(mesh); - rotateMeshXZby(mesh, -45); - rotateMeshYZby(mesh, -30); - u32 mc = mesh->getMeshBufferCount(); for (u32 i = 0; i < mc; ++i) { - video::SMaterial &material = mesh->getMeshBuffer(i)->getMaterial(); + const TileSpec *tile = &(f.tiles[i]); + scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); + colorizeMeshBuffer(buf, &tile->color); + video::SMaterial &material = buf->getMaterial(); material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_TRILINEAR_FILTER, false); material.setFlag(video::EMF_BACK_FACE_CULLING, true); material.setFlag(video::EMF_LIGHTING, false); - if (f.tiles[i].animation_frame_count > 1) { - FrameSpec animation_frame = f.tiles[i].frames[0]; + if (tile->animation_frame_count > 1) { + FrameSpec animation_frame = tile->frames[0]; material.setTexture(0, animation_frame.texture); } else { - material.setTexture(0, f.tiles[i].texture); + material.setTexture(0, tile->texture); } } + + rotateMeshXZby(mesh, -45); + rotateMeshYZby(mesh, -30); return mesh; } return NULL; diff --git a/src/wieldmesh.h b/src/wieldmesh.h index 0162c5e5a..2e78232ae 100644 --- a/src/wieldmesh.h +++ b/src/wieldmesh.h @@ -70,6 +70,11 @@ private: bool m_anisotropic_filter; bool m_bilinear_filter; bool m_trilinear_filter; + /*! + * Stores the colors of the mesh's mesh buffers. + * This does not include lighting. + */ + std::vector m_colors; // Bounding box culling is disabled for this type of scene node, // so this variable is just required so we can implement From 2d7a6f2cc0717eb92de4a91326a871d525ce513d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 12 Jan 2017 11:27:39 -0800 Subject: [PATCH 083/586] Vector: Add vector.sort(a, b): return box edges This function returns the box corners of the smallest box that includes the two given coordinates. --- builtin/common/vector.lua | 5 +++++ doc/lua_api.txt | 1 + 2 files changed, 6 insertions(+) diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index 90ba3cc8b..0549f9a56 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -138,3 +138,8 @@ function vector.divide(a, b) z = a.z / b} end end + +function vector.sort(a, b) + return {x = math.min(a.x, b.x), y = math.min(a.y, b.y), z = math.min(a.z, b.z)}, + {x = math.max(a.x, b.x), y = math.max(a.y, b.y), z = math.max(a.z, b.z)} +end diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 2a0b72053..31a1daefb 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1850,6 +1850,7 @@ Spatial Vectors * `vector.round(v)`: returns a vector, each dimension rounded to nearest int * `vector.apply(v, func)`: returns a vector * `vector.equals(v1, v2)`: returns a boolean +* `vector.sort(v1, v2)`: returns minp, maxp vectors of the cuboid defined by v1 and v2 For the following functions `x` can be either a vector or a number: From 7fc67199683d3c60fe0b3ddcb2a9594b4804cc38 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Thu, 12 Jan 2017 11:56:41 -0800 Subject: [PATCH 084/586] core: Add dir_to_yaw and yaw_to_dir helpers These are needed to go from things like entity yaw to a vector and vice versa. --- builtin/game/item.lua | 8 ++++++++ doc/lua_api.txt | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/builtin/game/item.lua b/builtin/game/item.lua index bf456a4e0..e51da6d6b 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -147,6 +147,14 @@ function core.wallmounted_to_dir(wallmounted) return wallmounted_to_dir[wallmounted] end +function core.dir_to_yaw(dir) + return -math.atan2(dir.x, dir.z) +end + +function core.yaw_to_dir(yaw) + return {x = -math.sin(yaw), y = 0, z = math.cos(yaw)} +end + function core.get_node_drops(nodename, toolname) local drop = ItemStack({name=nodename}):get_definition().drop if drop == nil then diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 31a1daefb..62a7b81f7 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2403,6 +2403,10 @@ and `minetest.auth_reload` call the authetification handler. * Convert a vector to a wallmounted value, used for `paramtype2="wallmounted"` * `minetest.wallmounted_to_dir(wallmounted)` * Convert a wallmounted value back into a vector aimed directly out the "back" of a node +* `minetest.dir_to_yaw(dir)` + * Convert a vector into a yaw (angle) +* `minetest.yaw_to_dir(yaw)` + * Convert yaw (angle) to a vector * `minetest.get_node_drops(nodename, toolname)` * Returns list of item names. * **Note**: This will be removed or modified in a future version. From d413dfe87c326385be4259afc2830e3e1638bf3c Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 21 Jan 2017 06:30:33 +0000 Subject: [PATCH 085/586] Dungeons: Support nodebox stairs wider than 1 node Previously, code did not support stair nodeboxes in corridors wider than 1 node. Make stair nodeboxes full width even in corridors with different widths in X and Z directions. --- src/dungeongen.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp index 78573da04..5dc87f8b0 100644 --- a/src/dungeongen.cpp +++ b/src/dungeongen.cpp @@ -437,14 +437,22 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, // rotate face 180 deg if // making stairs backwards int facedir = dir_to_facedir(dir * make_stairs); + v3s16 ps = p; + u16 stair_width = (dir.Z != 0) ? dp.holesize.X : dp.holesize.Z; + // Stair width direction vector + v3s16 swv = (dir.Z != 0) ? v3s16(1, 0, 0) : v3s16(0, 0, 1); - u32 vi = vm->m_area.index(p.X - dir.X, p.Y - 1, p.Z - dir.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) - vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + for (u16 st = 0; st < stair_width; st++) { + u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z); + if (vm->m_data[vi].getContent() == dp.c_wall) + vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); - vi = vm->m_area.index(p.X, p.Y, p.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) - vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + vi = vm->m_area.index(ps.X, ps.Y, ps.Z); + if (vm->m_data[vi].getContent() == dp.c_wall) + vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); + + ps += swv; + } } } else { makeFill(p + v3s16(-1, -1, -1), From 59fdf57134f62be8b8b4801c5f0fc4a2fca25f43 Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 22 Jan 2017 04:21:29 +0000 Subject: [PATCH 086/586] Zoom FOV: Reduce minimum zoom FOV to 7 degrees The default of 15 is unchanged. 7 degrees is x10 magnification which is common for binoculars. Alter hardcoded limits in camera.cpp: Minimum 7 degrees. Maximum 160 degrees to match upper limits in advanced settings. --- builtin/settingtypes.txt | 2 +- minetest.conf.example | 2 +- src/camera.cpp | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 0f416bc9a..581eef315 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -440,7 +440,7 @@ fov (Field of view) int 72 30 160 # Field of view while zooming in degrees. # This requires the "zoom" privilege on the server. -zoom_fov (Field of view for zoom) int 15 15 160 +zoom_fov (Field of view for zoom) int 15 7 160 # Adjust the gamma encoding for the light tables. Higher numbers are brighter. # This setting is for the client only and is ignored by the server. diff --git a/minetest.conf.example b/minetest.conf.example index 515b6cfd4..642b028c7 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -502,7 +502,7 @@ # Field of view while zooming in degrees. # This requires the "zoom" privilege on the server. -# type: int min: 15 max: 160 +# type: int min: 7 max: 160 # zoom_fov = 15 # Adjust the gamma encoding for the light tables. Higher numbers are brighter. diff --git a/src/camera.cpp b/src/camera.cpp index 2ad835817..a7679e43a 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -393,8 +393,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, } else { fov_degrees = m_cache_fov; } - fov_degrees = MYMAX(fov_degrees, 10.0); - fov_degrees = MYMIN(fov_degrees, 170.0); + fov_degrees = rangelim(fov_degrees, 7.0, 160.0); // FOV and aspect ratio m_aspect = (f32) porting::getWindowSize().X / (f32) porting::getWindowSize().Y; From 0cde270bf59c151e9a2f668631cd11b0d03f35ae Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 24 Jan 2017 15:19:29 +0100 Subject: [PATCH 087/586] Initialize TileAnimationParams to prevent crashes/bugs for legacy invocations of add_particle{,spawner} (fixes #5108) --- src/script/lua_api/l_particles.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp index 7f415844a..2f3e9a58d 100644 --- a/src/script/lua_api/l_particles.cpp +++ b/src/script/lua_api/l_particles.cpp @@ -51,6 +51,7 @@ int ModApiParticles::l_add_particle(lua_State *L) bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; struct TileAnimationParams animation; + animation.type = TAT_NONE; std::string texture = ""; std::string playername = ""; @@ -155,6 +156,7 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) bool collisiondetection, vertical, collision_removal; collisiondetection = vertical = collision_removal = false; struct TileAnimationParams animation; + animation.type = TAT_NONE; ServerActiveObject *attached = NULL; std::string texture = ""; std::string playername = ""; From 87e9466cafd72ab9b78218c67352c80d20e008a8 Mon Sep 17 00:00:00 2001 From: raymoo Date: Tue, 24 Jan 2017 08:25:11 -0800 Subject: [PATCH 088/586] Wrap to positive degree values (#5106) --- src/network/serverpackethandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 408fe7706..ac428e8ed 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -811,7 +811,7 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, v3f speed((f32)ss.X / 100.0, (f32)ss.Y / 100.0, (f32)ss.Z / 100.0); pitch = modulo360f(pitch); - yaw = modulo360f(yaw); + yaw = wrapDegrees_0_360(yaw); playersao->setBasePosition(position); player->setSpeed(speed); From 33e0eedbfb116111fa79cbc506d9e94ffbb1543b Mon Sep 17 00:00:00 2001 From: number Zero Date: Wed, 25 Jan 2017 00:33:01 +0300 Subject: [PATCH 089/586] Add smooth lighting for all nodes Note: Smooth lighting disables the mesh cache. --- src/content_mapblock.cpp | 518 +++++++++++++++++++++++++++++---------- src/mapblock_mesh.cpp | 2 +- src/nodedef.cpp | 5 + 3 files changed, 396 insertions(+), 129 deletions(-) diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 742bfb1fd..45822666f 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -30,6 +30,27 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "noise.h" +// Distance of light extrapolation (for oversized nodes) +// After this distance, it gives up and considers light level constant +#define SMOOTH_LIGHTING_OVERSIZE 1.0 + +struct LightFrame +{ + f32 lightsA[8]; + f32 lightsB[8]; + u8 light_source; +}; + +static const v3s16 light_dirs[8] = { + v3s16(-1, -1, -1), + v3s16(-1, -1, 1), + v3s16(-1, 1, -1), + v3s16(-1, 1, 1), + v3s16( 1, -1, -1), + v3s16( 1, -1, 1), + v3s16( 1, 1, -1), + v3s16( 1, 1, 1), +}; // Create a cuboid. // collector - the MeshCollector for the resulting polygons @@ -180,6 +201,150 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box, } } +// Create a cuboid. +// collector - the MeshCollector for the resulting polygons +// box - the position and size of the box +// tiles - the tiles (materials) to use (for all 6 faces) +// tilecount - number of entries in tiles, 1<=tilecount<=6 +// lights - vertex light levels. The order is the same as in light_dirs +// txc - texture coordinates - this is a list of texture coordinates +// for the opposite corners of each face - therefore, there +// should be (2+2)*6=24 values in the list. Alternatively, pass +// NULL to use the entire texture for each face. The order of +// the faces in the list is up-down-right-left-back-front +// (compatible with ContentFeatures). If you specified 0,0,1,1 +// for each face, that would be the same as passing NULL. +// light_source - node light emission +static void makeSmoothLightedCuboid(MeshCollector *collector, const aabb3f &box, + TileSpec *tiles, int tilecount, const u16 *lights , const f32 *txc, + const u8 light_source) +{ + assert(tilecount >= 1 && tilecount <= 6); // pre-condition + + v3f min = box.MinEdge; + v3f max = box.MaxEdge; + + if (txc == NULL) { + static const f32 txc_default[24] = { + 0,0,1,1, + 0,0,1,1, + 0,0,1,1, + 0,0,1,1, + 0,0,1,1, + 0,0,1,1 + }; + txc = txc_default; + } + static const u8 light_indices[24] = { + 3, 7, 6, 2, + 0, 4, 5, 1, + 6, 7, 5, 4, + 3, 2, 0, 1, + 7, 3, 1, 5, + 2, 6, 4, 0 + }; + video::S3DVertex vertices[24] = { + // up + video::S3DVertex(min.X, max.Y, max.Z, 0, 1, 0, video::SColor(), txc[0], txc[1]), + video::S3DVertex(max.X, max.Y, max.Z, 0, 1, 0, video::SColor(), txc[2], txc[1]), + video::S3DVertex(max.X, max.Y, min.Z, 0, 1, 0, video::SColor(), txc[2], txc[3]), + video::S3DVertex(min.X, max.Y, min.Z, 0, 1, 0, video::SColor(), txc[0], txc[3]), + // down + video::S3DVertex(min.X, min.Y, min.Z, 0, -1, 0, video::SColor(), txc[4], txc[5]), + video::S3DVertex(max.X, min.Y, min.Z, 0, -1, 0, video::SColor(), txc[6], txc[5]), + video::S3DVertex(max.X, min.Y, max.Z, 0, -1, 0, video::SColor(), txc[6], txc[7]), + video::S3DVertex(min.X, min.Y, max.Z, 0, -1, 0, video::SColor(), txc[4], txc[7]), + // right + video::S3DVertex(max.X, max.Y, min.Z, 1, 0, 0, video::SColor(), txc[ 8], txc[9]), + video::S3DVertex(max.X, max.Y, max.Z, 1, 0, 0, video::SColor(), txc[10], txc[9]), + video::S3DVertex(max.X, min.Y, max.Z, 1, 0, 0, video::SColor(), txc[10], txc[11]), + video::S3DVertex(max.X, min.Y, min.Z, 1, 0, 0, video::SColor(), txc[ 8], txc[11]), + // left + video::S3DVertex(min.X, max.Y, max.Z, -1, 0, 0, video::SColor(), txc[12], txc[13]), + video::S3DVertex(min.X, max.Y, min.Z, -1, 0, 0, video::SColor(), txc[14], txc[13]), + video::S3DVertex(min.X, min.Y, min.Z, -1, 0, 0, video::SColor(), txc[14], txc[15]), + video::S3DVertex(min.X, min.Y, max.Z, -1, 0, 0, video::SColor(), txc[12], txc[15]), + // back + video::S3DVertex(max.X, max.Y, max.Z, 0, 0, 1, video::SColor(), txc[16], txc[17]), + video::S3DVertex(min.X, max.Y, max.Z, 0, 0, 1, video::SColor(), txc[18], txc[17]), + video::S3DVertex(min.X, min.Y, max.Z, 0, 0, 1, video::SColor(), txc[18], txc[19]), + video::S3DVertex(max.X, min.Y, max.Z, 0, 0, 1, video::SColor(), txc[16], txc[19]), + // front + video::S3DVertex(min.X, max.Y, min.Z, 0, 0, -1, video::SColor(), txc[20], txc[21]), + video::S3DVertex(max.X, max.Y, min.Z, 0, 0, -1, video::SColor(), txc[22], txc[21]), + video::S3DVertex(max.X, min.Y, min.Z, 0, 0, -1, video::SColor(), txc[22], txc[23]), + video::S3DVertex(min.X, min.Y, min.Z, 0, 0, -1, video::SColor(), txc[20], txc[23]), + }; + + for(int i = 0; i < 6; i++) { + switch (tiles[MYMIN(i, tilecount-1)].rotation) { + case 0: + break; + case 1: //R90 + for (int x = 0; x < 4; x++) + vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); + break; + case 2: //R180 + for (int x = 0; x < 4; x++) + vertices[i*4+x].TCoords.rotateBy(180,irr::core::vector2df(0, 0)); + break; + case 3: //R270 + for (int x = 0; x < 4; x++) + vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); + break; + case 4: //FXR90 + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; + vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); + } + break; + case 5: //FXR270 + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; + vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); + } + break; + case 6: //FYR90 + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; + vertices[i*4+x].TCoords.rotateBy(90,irr::core::vector2df(0, 0)); + } + break; + case 7: //FYR270 + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; + vertices[i*4+x].TCoords.rotateBy(270,irr::core::vector2df(0, 0)); + } + break; + case 8: //FX + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.X = 1.0 - vertices[i*4+x].TCoords.X; + } + break; + case 9: //FY + for (int x = 0; x < 4; x++) { + vertices[i*4+x].TCoords.Y = 1.0 - vertices[i*4+x].TCoords.Y; + } + break; + default: + break; + } + } + u16 indices[] = {0,1,2,2,3,0}; + for (s32 j = 0; j < 24; ++j) { + int tileindex = MYMIN(j / 4, tilecount - 1); + vertices[j].Color = encode_light_and_color(lights[light_indices[j]], + tiles[tileindex].color, light_source); + if (!light_source) + applyFacesShading(vertices[j].Color, vertices[j].Normal); + } + // Add to mesh collector + for (s32 k = 0; k < 6; ++k) { + int tileindex = MYMIN(k, tilecount - 1); + collector->append(tiles[tileindex], vertices + 4 * k, 4, indices, 6); + } +} + // Create a cuboid. // collector - the MeshCollector for the resulting polygons // box - the position and size of the box @@ -205,6 +370,64 @@ void makeCuboid(MeshCollector *collector, const aabb3f &box, TileSpec *tiles, makeCuboid(collector, box, tiles, tilecount, color, txc, light_source); } +// Gets the base lighting values for a node +// frame - resulting (opaque) data +// p - node position (absolute) +// data - ... +// light_source - node light emission level +static void getSmoothLightFrame(LightFrame *frame, const v3s16 &p, MeshMakeData *data, u8 light_source) +{ + for (int k = 0; k < 8; ++k) { + u16 light = getSmoothLight(p, light_dirs[k], data); + frame->lightsA[k] = light & 0xff; + frame->lightsB[k] = light >> 8; + } + frame->light_source = light_source; +} + +// Calculates vertex light level +// frame - light values from getSmoothLightFrame() +// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so) +static u16 blendLight(const LightFrame &frame, const core::vector3df& vertex_pos) +{ + f32 x = core::clamp(vertex_pos.X / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 y = core::clamp(vertex_pos.Y / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 z = core::clamp(vertex_pos.Z / BS + 0.5, 0.0 - SMOOTH_LIGHTING_OVERSIZE, 1.0 + SMOOTH_LIGHTING_OVERSIZE); + f32 lightA = 0.0; + f32 lightB = 0.0; + for (int k = 0; k < 8; ++k) { + f32 dx = (k & 4) ? x : 1 - x; + f32 dy = (k & 2) ? y : 1 - y; + f32 dz = (k & 1) ? z : 1 - z; + lightA += dx * dy * dz * frame.lightsA[k]; + lightB += dx * dy * dz * frame.lightsB[k]; + } + return + core::clamp(core::round32(lightA), 0, 255) | + core::clamp(core::round32(lightB), 0, 255) << 8; +} + +// Calculates vertex color to be used in mapblock mesh +// frame - light values from getSmoothLightFrame() +// vertex_pos - vertex position in the node (coordinates are clamped to [0.0, 1.0] or so) +// tile_color - node's tile color +static video::SColor blendLight(const LightFrame &frame, + const core::vector3df& vertex_pos, video::SColor tile_color) +{ + u16 light = blendLight(frame, vertex_pos); + return encode_light_and_color(light, tile_color, frame.light_source); +} + +static video::SColor blendLight(const LightFrame &frame, + const core::vector3df& vertex_pos, const core::vector3df& vertex_normal, + video::SColor tile_color) +{ + video::SColor color = blendLight(frame, vertex_pos, tile_color); + if (!frame.light_source) + applyFacesShading(color, vertex_normal); + return color; +} + static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, MeshMakeData *data, MapNode n, int v, int *neighbors) { @@ -213,6 +436,74 @@ static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef, *neighbors |= v; } +static void makeAutoLightedCuboid(MeshCollector *collector, MeshMakeData *data, + const v3f &pos, aabb3f box, TileSpec &tile, + /* pre-computed, for non-smooth lighting only */ const video::SColor color, + /* for smooth lighting only */ const LightFrame &frame) +{ + f32 dx1 = box.MinEdge.X; + f32 dy1 = box.MinEdge.Y; + f32 dz1 = box.MinEdge.Z; + f32 dx2 = box.MaxEdge.X; + f32 dy2 = box.MaxEdge.Y; + f32 dz2 = box.MaxEdge.Z; + box.MinEdge += pos; + box.MaxEdge += pos; + f32 tx1 = (box.MinEdge.X / BS) + 0.5; + f32 ty1 = (box.MinEdge.Y / BS) + 0.5; + f32 tz1 = (box.MinEdge.Z / BS) + 0.5; + f32 tx2 = (box.MaxEdge.X / BS) + 0.5; + f32 ty2 = (box.MaxEdge.Y / BS) + 0.5; + f32 tz2 = (box.MaxEdge.Z / BS) + 0.5; + f32 txc[24] = { + tx1, 1-tz2, tx2, 1-tz1, // up + tx1, tz1, tx2, tz2, // down + tz1, 1-ty2, tz2, 1-ty1, // right + 1-tz2, 1-ty2, 1-tz1, 1-ty1, // left + 1-tx2, 1-ty2, 1-tx1, 1-ty1, // back + tx1, 1-ty2, tx2, 1-ty1, // front + }; + if (data->m_smooth_lighting) { + u16 lights[8]; + for (int j = 0; j < 8; ++j) { + f32 x = (j & 4) ? dx2 : dx1; + f32 y = (j & 2) ? dy2 : dy1; + f32 z = (j & 1) ? dz2 : dz1; + lights[j] = blendLight(frame, core::vector3df(x, y, z)); + } + makeSmoothLightedCuboid(collector, box, &tile, 1, lights, txc, frame.light_source); + } else { + makeCuboid(collector, box, &tile, 1, color, txc, frame.light_source); + } +} + +static void makeAutoLightedCuboidEx(MeshCollector *collector, MeshMakeData *data, + const v3f &pos, aabb3f box, TileSpec &tile, f32 *txc, + /* pre-computed, for non-smooth lighting only */ const video::SColor color, + /* for smooth lighting only */ const LightFrame &frame) +{ + f32 dx1 = box.MinEdge.X; + f32 dy1 = box.MinEdge.Y; + f32 dz1 = box.MinEdge.Z; + f32 dx2 = box.MaxEdge.X; + f32 dy2 = box.MaxEdge.Y; + f32 dz2 = box.MaxEdge.Z; + box.MinEdge += pos; + box.MaxEdge += pos; + if (data->m_smooth_lighting) { + u16 lights[8]; + for (int j = 0; j < 8; ++j) { + f32 x = (j & 4) ? dx2 : dx1; + f32 y = (j & 2) ? dy2 : dy1; + f32 z = (j & 1) ? dz2 : dz1; + lights[j] = blendLight(frame, core::vector3df(x, y, z)); + } + makeSmoothLightedCuboid(collector, box, &tile, 1, lights, txc, frame.light_source); + } else { + makeCuboid(collector, box, &tile, 1, color, txc, frame.light_source); + } +} + // For use in mapblock_mesh_generate_special // X,Y,Z of position must be -1,0,1 // This expression is a simplification of @@ -251,7 +542,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, /* Some settings */ - bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); + bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache") && + !data->m_smooth_lighting; // Mesh cache is not supported with smooth lighting v3s16 blockpos_nodes = data->m_blockpos*MAP_BLOCKSIZE; @@ -268,13 +560,20 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if(f.solidness != 0) continue; - switch(f.drawtype){ + if (f.drawtype == NDT_AIRLIKE) + continue; + + LightFrame frame; + if (data->m_smooth_lighting) + getSmoothLightFrame(&frame, blockpos_nodes + p, data, f.light_source); + else + frame.light_source = f.light_source; + + switch(f.drawtype) { default: infostream << "Got " << f.drawtype << std::endl; FATAL_ERROR("Unknown drawtype"); break; - case NDT_AIRLIKE: - break; case NDT_LIQUID: { /* @@ -383,8 +682,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, vertices[1].Pos.Y = -0.5 * BS; } - for(s32 j=0; j<4; j++) - { + for (s32 j = 0; j < 4; j++) { if(dir == v3s16(0,0,1)) vertices[j].Pos.rotateXZBy(0); if(dir == v3s16(0,0,-1)) @@ -401,6 +699,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, vertices[j].Pos.Z *= 0.98; }*/ + if (data->m_smooth_lighting) + vertices[j].Color = blendLight(frame, vertices[j].Pos, current_tile->color); vertices[j].Pos += intToFloat(p, BS); } @@ -423,10 +723,11 @@ void mapblock_mesh_generate_special(MeshMakeData *data, video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c1, 0,0), }; - v3f offset(p.X * BS, (p.Y + 0.5) * BS, p.Z * BS); - for(s32 i=0; i<4; i++) - { - vertices[i].Pos += offset; + for (s32 i = 0; i < 4; i++) { + vertices[i].Pos.Y += 0.5 * BS; + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile_liquid.color); + vertices[i].Pos += intToFloat(p, BS); } u16 indices[] = {0,1,2,2,3,0}; @@ -704,6 +1005,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, vertices[j].Pos.Z *= 0.98; }*/ + if (data->m_smooth_lighting) + vertices[j].Color = blendLight(frame, vertices[j].Pos, current_tile->color); vertices[j].Pos += intToFloat(p, BS); } @@ -737,6 +1040,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, //vertices[i].Pos.Y += neighbor_levels[v3s16(0,0,0)]; s32 j = corner_resolve[i]; vertices[i].Pos.Y += corner_levels[j]; + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile_liquid.color); vertices[i].Pos += intToFloat(p, BS); } @@ -828,7 +1133,9 @@ void mapblock_mesh_generate_special(MeshMakeData *data, for(u16 i=0; i<4; i++) vertices[i].Pos.rotateXZBy(90); - for(u16 i=0; i<4; i++){ + for (u16 i = 0; i < 4; i++) { + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, vertices[i].Normal, tile.color); vertices[i].Pos += intToFloat(p, BS); } @@ -860,9 +1167,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, video::SColor tile0color = encode_light_and_color(l, tiles[0].color, f.light_source); - video::SColor tile0colors[6]; - for (i = 0; i < 6; i++) - tile0colors[i] = tile0color; TileSpec glass_tiles[6]; video::SColor glasscolor[6]; @@ -995,7 +1299,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 0,1, 8, 0,4,16, 3,4,17, 3,1, 9 }; - f32 tx1, ty1, tz1, tx2, ty2, tz2; aabb3f box; for(i = 0; i < 12; i++) @@ -1008,24 +1311,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if (edge_invisible) continue; box = frame_edges[i]; - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc1[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, &tiles[0], 1, tile0colors, - txc1, f.light_source); + makeAutoLightedCuboid(&collector, data, pos, box, tiles[0], tile0color, frame); } for(i = 0; i < 6; i++) @@ -1033,37 +1319,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if (!visible_faces[i]) continue; box = glass_faces[i]; - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc2[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, &glass_tiles[i], 1, glasscolor, - txc2, f.light_source); + makeAutoLightedCuboid(&collector, data, pos, box, glass_tiles[i], glasscolor[i], frame); } if (param2 > 0 && f.special_tiles[0].texture) { // Interior volume level is in range 0 .. 63, // convert it to -0.5 .. 0.5 float vlev = (((float)param2 / 63.0 ) * 2.0 - 1.0); - TileSpec tile=getSpecialTile(f, n, 0); + TileSpec tile = getSpecialTile(f, n, 0); video::SColor special_color = encode_light_and_color(l, tile.color, f.light_source); - TileSpec interior_tiles[6]; - for (i = 0; i < 6; i++) - interior_tiles[i] = tile; - float offset = 0.003; box = aabb3f(visible_faces[3] ? -b : -a + offset, visible_faces[1] ? -b : -a + offset, @@ -1071,24 +1336,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, visible_faces[2] ? b : a - offset, visible_faces[0] ? b * vlev : a * vlev - offset, visible_faces[4] ? b : a - offset); - box.MinEdge += pos; - box.MaxEdge += pos; - tx1 = (box.MinEdge.X / BS) + 0.5; - ty1 = (box.MinEdge.Y / BS) + 0.5; - tz1 = (box.MinEdge.Z / BS) + 0.5; - tx2 = (box.MaxEdge.X / BS) + 0.5; - ty2 = (box.MaxEdge.Y / BS) + 0.5; - tz2 = (box.MaxEdge.Z / BS) + 0.5; - f32 txc3[24] = { - tx1, 1-tz2, tx2, 1-tz1, - tx1, tz1, tx2, tz2, - tz1, 1-ty2, tz2, 1-ty1, - 1-tz2, 1-ty2, 1-tz1, 1-ty1, - 1-tx2, 1-ty2, 1-tx1, 1-ty1, - tx1, 1-ty2, tx2, 1-ty1, - }; - makeCuboid(&collector, box, interior_tiles, 6, special_color, - txc3, f.light_source); + makeAutoLightedCuboid(&collector, data, pos, box, tile, special_color, frame); } break;} case NDT_ALLFACES: @@ -1101,10 +1349,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, v3f pos = intToFloat(p, BS); aabb3f box(-BS/2,-BS/2,-BS/2,BS/2,BS/2,BS/2); - box.MinEdge += pos; - box.MaxEdge += pos; - makeCuboid(&collector, box, &tile_leaves, 1, c, NULL, - f.light_source); + makeAutoLightedCuboid(&collector, data, pos, box, tile_leaves, c, frame); break;} case NDT_ALLFACES_OPTIONAL: // This is always pre-converted to something else @@ -1144,7 +1389,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, video::S3DVertex(-s, s,0, 0,0,0, c, 0,0), }; - for(s32 i=0; i<4; i++) + for (s32 i = 0; i < 4; i++) { if(dir == v3s16(1,0,0)) vertices[i].Pos.rotateXZBy(0); @@ -1159,6 +1404,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if(dir == v3s16(0,1,0)) vertices[i].Pos.rotateXZBy(-45); + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); } @@ -1189,7 +1436,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, v3s16 dir = n.getWallMountedDir(nodedef); - for(s32 i=0; i<4; i++) + for (s32 i = 0; i < 4; i++) { if(dir == v3s16(1,0,0)) vertices[i].Pos.rotateXZBy(0); @@ -1204,6 +1451,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, if(dir == v3s16(0,1,0)) vertices[i].Pos.rotateXYBy(90); + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); } @@ -1355,6 +1604,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, for (int i = 0; i < 4; i++) { vertices[i].Pos *= f.visual_scale; vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1); + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); // move to a random spot to avoid moire if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) { @@ -1507,6 +1758,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, for (int i = 0; i < 4; i++) { vertices[i].Pos *= f.visual_scale; + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); } @@ -1537,8 +1790,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // The post - always present aabb3f post(-post_rad,-BS/2,-post_rad,post_rad,BS/2,post_rad); - post.MinEdge += pos; - post.MaxEdge += pos; f32 postuv[24]={ 6/16.,6/16.,10/16.,10/16., 6/16.,6/16.,10/16.,10/16., @@ -1546,8 +1797,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 4/16.,0,8/16.,1, 8/16.,0,12/16.,1, 12/16.,0,16/16.,1}; - makeCuboid(&collector, post, &tile_rot, 1, c, postuv, - f.light_source); + makeAutoLightedCuboidEx(&collector, data, pos, post, tile_rot, postuv, c, frame); // Now a section of fence, +X, if there's a post there v3s16 p2 = p; @@ -1558,8 +1808,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, { aabb3f bar(-bar_len+BS/2,-bar_rad+BS/4,-bar_rad, bar_len+BS/2,bar_rad+BS/4,bar_rad); - bar.MinEdge += pos; - bar.MaxEdge += pos; f32 xrailuv[24]={ 0/16.,2/16.,16/16.,4/16., 0/16.,4/16.,16/16.,6/16., @@ -1567,12 +1815,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 10/16.,10/16.,12/16.,12/16., 0/16.,8/16.,16/16.,10/16., 0/16.,14/16.,16/16.,16/16.}; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv, f.light_source); + makeAutoLightedCuboidEx(&collector, data, pos, bar, tile_nocrack, xrailuv, c, frame); bar.MinEdge.Y -= BS/2; bar.MaxEdge.Y -= BS/2; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, xrailuv, f.light_source); + makeAutoLightedCuboidEx(&collector, data, pos, bar, tile_nocrack, xrailuv, c, frame); } // Now a section of fence, +Z, if there's a post there @@ -1584,8 +1830,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, { aabb3f bar(-bar_rad,-bar_rad+BS/4,-bar_len+BS/2, bar_rad,bar_rad+BS/4,bar_len+BS/2); - bar.MinEdge += pos; - bar.MaxEdge += pos; f32 zrailuv[24]={ 3/16.,1/16.,5/16.,5/16., // cannot rotate; stretch 4/16.,1/16.,6/16.,5/16., // for wood texture instead @@ -1593,12 +1837,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data, 0/16.,6/16.,16/16.,8/16., 6/16.,6/16.,8/16.,8/16., 10/16.,10/16.,12/16.,12/16.}; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv, f.light_source); + makeAutoLightedCuboidEx(&collector, data, pos, bar, tile_nocrack, zrailuv, c, frame); bar.MinEdge.Y -= BS/2; bar.MaxEdge.Y -= BS/2; - makeCuboid(&collector, bar, &tile_nocrack, 1, - c, zrailuv, f.light_source); + makeAutoLightedCuboidEx(&collector, data, pos, bar, tile_nocrack, zrailuv, c, frame); } break;} case NDT_RAILLIKE: @@ -1729,6 +1971,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, { if(angle != 0) vertices[i].Pos.rotateXZBy(angle); + if (data->m_smooth_lighting) + vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); } @@ -1746,14 +1990,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data, v3s16(0, 0, -1) }; - u16 l = getInteriorLight(n, 1, nodedef); TileSpec tiles[6]; video::SColor colors[6]; - for(int j = 0; j < 6; j++) { + for (int j = 0; j < 6; j++) { // Handles facedir rotation for textures tiles[j] = getNodeTile(n, p, tile_dirs[j], data); - colors[j]= encode_light_and_color(l, tiles[j].color, - f.light_source); + } + if (!data->m_smooth_lighting) { + u16 l = getInteriorLight(n, 1, nodedef); + for (int j = 0; j < 6; j++) + colors[j] = encode_light_and_color(l, tiles[j].color, f.light_source); } v3f pos = intToFloat(p, BS); @@ -1790,33 +2036,27 @@ void mapblock_mesh_generate_special(MeshMakeData *data, std::vector boxes; n.getNodeBoxes(nodedef, &boxes, neighbors); - for(std::vector::iterator + for (std::vector::iterator i = boxes.begin(); - i != boxes.end(); ++i) - { + i != boxes.end(); ++i) { aabb3f box = *i; + + f32 dx1 = box.MinEdge.X; + f32 dy1 = box.MinEdge.Y; + f32 dz1 = box.MinEdge.Z; + f32 dx2 = box.MaxEdge.X; + f32 dy2 = box.MaxEdge.Y; + f32 dz2 = box.MaxEdge.Z; + box.MinEdge += pos; box.MaxEdge += pos; - f32 temp; if (box.MinEdge.X > box.MaxEdge.X) - { - temp=box.MinEdge.X; - box.MinEdge.X=box.MaxEdge.X; - box.MaxEdge.X=temp; - } + std::swap(box.MinEdge.X, box.MaxEdge.X); if (box.MinEdge.Y > box.MaxEdge.Y) - { - temp=box.MinEdge.Y; - box.MinEdge.Y=box.MaxEdge.Y; - box.MaxEdge.Y=temp; - } + std::swap(box.MinEdge.Y, box.MaxEdge.Y); if (box.MinEdge.Z > box.MaxEdge.Z) - { - temp=box.MinEdge.Z; - box.MinEdge.Z=box.MaxEdge.Z; - box.MaxEdge.Z=temp; - } + std::swap(box.MinEdge.Z, box.MaxEdge.Z); // // Compute texture coords @@ -1840,7 +2080,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data, // front tx1, 1-ty2, tx2, 1-ty1, }; - makeCuboid(&collector, box, tiles, 6, colors, txc, f.light_source); + if (data->m_smooth_lighting) { + u16 lights[8]; + for (int j = 0; j < 8; ++j) { + f32 x = (j & 4) ? dx2 : dx1; + f32 y = (j & 2) ? dy2 : dy1; + f32 z = (j & 1) ? dz2 : dz1; + lights[j] = blendLight(frame, core::vector3df(x, y, z)); + } + makeSmoothLightedCuboid(&collector, box, tiles, 6, lights, txc, f.light_source); + } else { + makeCuboid(&collector, box, tiles, 6, colors, txc, f.light_source); + } } break;} case NDT_MESH: @@ -1862,9 +2113,9 @@ void mapblock_mesh_generate_special(MeshMakeData *data, } } - if (f.mesh_ptr[facedir]) { + if (!data->m_smooth_lighting && f.mesh_ptr[facedir]) { // use cached meshes - for(u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) { + for (u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) { const TileSpec &tile = getNodeTileN(n, p, j, data); scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j); collector.append(tile, (video::S3DVertex *) @@ -1879,14 +2130,25 @@ void mapblock_mesh_generate_special(MeshMakeData *data, rotateMeshBy6dFacedir(mesh, facedir); recalculateBoundingBox(mesh); meshmanip->recalculateNormals(mesh, true, false); - for(u16 j = 0; j < mesh->getMeshBufferCount(); j++) { + for (u16 j = 0; j < mesh->getMeshBufferCount(); j++) { const TileSpec &tile = getNodeTileN(n, p, j, data); scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - collector.append(tile, (video::S3DVertex *) - buf->getVertices(), buf->getVertexCount(), - buf->getIndices(), buf->getIndexCount(), pos, - encode_light_and_color(l, tile.color, f.light_source), - f.light_source); + video::S3DVertex *vertices = (video::S3DVertex *)buf->getVertices(); + u32 vertex_count = buf->getVertexCount(); + if (data->m_smooth_lighting) { + for (u16 m = 0; m < vertex_count; ++m) { + video::S3DVertex &vertex = vertices[m]; + vertex.Color = blendLight(frame, vertex.Pos, vertex.Normal, tile.color); + vertex.Pos += pos; + } + collector.append(tile, vertices, vertex_count, + buf->getIndices(), buf->getIndexCount()); + } else { + collector.append(tile, vertices, vertex_count, + buf->getIndices(), buf->getIndexCount(), pos, + encode_light_and_color(l, tile.color, f.light_source), + f.light_source); + } } mesh->drop(); } diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index dfd6f55a5..0744cd527 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -236,7 +236,7 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data) for (u32 i = 0; i < 8; i++) { - const MapNode &n = data->m_vmanip.getNodeRefUnsafeCheckFlags(p - dirs8[i]); + MapNode n = data->m_vmanip.getNodeNoExNoEmerge(p - dirs8[i]); // if it's CONTENT_IGNORE we can't do any light calculations if (n.getContent() == CONTENT_IGNORE) { diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 98f795c7a..0bb150267 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -269,10 +269,15 @@ void TextureSettings::readSettings() bool enable_shaders = g_settings->getBool("enable_shaders"); bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping"); bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion"); + bool smooth_lighting = g_settings->getBool("smooth_lighting"); enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); enable_minimap = g_settings->getBool("enable_minimap"); std::string leaves_style_str = g_settings->get("leaves_style"); + // Mesh cache is not supported in combination with smooth lighting + if (smooth_lighting) + enable_mesh_cache = false; + use_normal_texture = enable_shaders && (enable_bumpmapping || enable_parallax_occlusion); if (leaves_style_str == "fancy") { From 08911160aa5294883a7ebfb681fbf0c1a858dc78 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 25 Jan 2017 09:57:33 +0000 Subject: [PATCH 090/586] Block spam messages before calling on_chatmessage callbacks (#4805) Fixes #4799 --- src/server.cpp | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index c7d4fcba9..e5714ac03 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2790,40 +2790,41 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna RollbackScopeActor rollback_scope(m_rollback, std::string("player:") + name); - // Line to send - std::wstring line; - // Whether to send line to the player that sent the message, or to all players - bool broadcast_line = true; - - // Run script hook - bool ate = m_script->on_chat_message(name, - wide_to_utf8(wmessage)); - // If script ate the message, don't proceed - if (ate) - return L""; - if (player) { switch (player->canSendChatMessage()) { case RPLAYER_CHATRESULT_FLOODING: { std::wstringstream ws; ws << L"You cannot send more messages. You are limited to " - << g_settings->getFloat("chat_message_limit_per_10sec") - << L" messages per 10 seconds."; + << g_settings->getFloat("chat_message_limit_per_10sec") + << L" messages per 10 seconds."; return ws.str(); } case RPLAYER_CHATRESULT_KICK: - DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding."); + DenyAccess_Legacy(player->peer_id, + L"You have been kicked due to message flooding."); return L""; - case RPLAYER_CHATRESULT_OK: break; - default: FATAL_ERROR("Unhandled chat filtering result found."); + case RPLAYER_CHATRESULT_OK: + break; + default: + FATAL_ERROR("Unhandled chat filtering result found."); } } - if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) { + if (m_max_chatmessage_length > 0 + && wmessage.length() > m_max_chatmessage_length) { return L"Your message exceed the maximum chat message limit set on the server. " - L"It was refused. Send a shorter message"; + L"It was refused. Send a shorter message"; } + // Run script hook, exit if script ate the chat message + if (m_script->on_chat_message(name, wide_to_utf8(wmessage))) + return L""; + + // Line to send + std::wstring line; + // Whether to send line to the player that sent the message, or to all players + bool broadcast_line = true; + // Commands are implemented in Lua, so only catch invalid // commands that were not "eaten" and send an error back if (wmessage[0] == L'/') { From 9f108b56d35cb607b538562ac369c457cd129eaa Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 25 Jan 2017 15:23:29 +0000 Subject: [PATCH 091/586] Dungeongen: Fix out-of-voxelmanip access segfault My recent dungeon commit allowed stairs to be placed across the full width of corridors, but some of the new node positions accessed were missing checks for being within the voxelmanip, causing occasional segfaults near dungeons with corridors wider than 1 node. Add 'vm->m_area.contains(pos)' checks just before stair position voxelmanip access. This allows an earlier check to be removed as it is now redundant. --- src/dungeongen.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp index 5dc87f8b0..b8ee2b924 100644 --- a/src/dungeongen.cpp +++ b/src/dungeongen.cpp @@ -415,8 +415,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, if (partcount != 0) p.Y += make_stairs; - if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0)) && - vm->m_area.contains(v3s16(p.X - dir.X, p.Y - 1, p.Z - dir.Z))) { + // Check segment of minimum size corridor is in voxelmanip + if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0))) { if (make_stairs) { makeFill(p + v3s16(-1, -1, -1), dp.holesize + v3s16(2, 3, 2), @@ -444,11 +444,13 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir, for (u16 st = 0; st < stair_width; st++) { u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) + if (vm->m_area.contains(ps + v3s16(-dir.X, -1, -dir.Z)) && + vm->m_data[vi].getContent() == dp.c_wall) vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); vi = vm->m_area.index(ps.X, ps.Y, ps.Z); - if (vm->m_data[vi].getContent() == dp.c_wall) + if (vm->m_area.contains(ps) && + vm->m_data[vi].getContent() == dp.c_wall) vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir); ps += swv; From c268db7b46645b8000bd77ce80e919080a75f152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Thu, 26 Jan 2017 16:10:56 +0100 Subject: [PATCH 092/586] Fix after hardware node coloring (#5114) --- src/mapblock_mesh.cpp | 8 ++++---- src/particles.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 0744cd527..79d02d6ff 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -1090,10 +1090,10 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): brightness of vertices 1 and 3 differ less than the brightness of vertices 0 and 2. */ - if (abs(f.vertices[0].Color.getAverage() - - f.vertices[2].Color.getAverage()) - > abs(f.vertices[1].Color.getAverage() - - f.vertices[3].Color.getAverage())) + if (abs(f.vertices[0].Color.getLuminance() + - f.vertices[2].Color.getLuminance()) + > abs(f.vertices[1].Color.getLuminance() + - f.vertices[3].Color.getLuminance())) indices_p = indices_alternate; collector.append(f.tile, f.vertices, 4, indices_p, 6); diff --git a/src/particles.h b/src/particles.h index 3177f2cfd..7ffb1c728 100644 --- a/src/particles.h +++ b/src/particles.h @@ -32,8 +32,8 @@ with this program; if not, write to the Free Software Foundation, Inc., struct ClientEvent; class ParticleManager; class ClientEnvironment; -class MapNode; -class ContentFeatures; +struct MapNode; +struct ContentFeatures; class Particle : public scene::ISceneNode { From ae929ce2fdcfcfc95cffece35f3d38ea4d96dd9f Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 23 Jan 2017 08:07:34 +0000 Subject: [PATCH 093/586] Dungeons: Add nodebox stairs to desert and sandstone dungeons Desert and sandstone dungeons have 2 node wide corridors. Previously, nodebox stairs were disabled because dungeon generation code did not support nodebox stairs wider than 1 node, now it does. Add 'stair desert stone' content id to MappgenBasic. Requires 'mapgen stair desert stone' to be added to Minetest Game. --- src/mapgen.cpp | 5 +++-- src/mapgen.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index fd4f5858f..e42fc7467 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -604,6 +604,7 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer c_cobble = ndef->getId("mapgen_cobble"); c_stair_cobble = ndef->getId("mapgen_stair_cobble"); c_mossycobble = ndef->getId("mapgen_mossycobble"); + c_stair_desert_stone = ndef->getId("mapgen_stair_desert_stone"); c_sandstonebrick = ndef->getId("mapgen_sandstonebrick"); c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick"); @@ -867,7 +868,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) case MGSTONE_DESERT_STONE: dp.c_wall = c_desert_stone; dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_desert_stone; + dp.c_stair = c_stair_desert_stone; dp.diagonal_dirs = true; dp.holesize = v3s16(2, 3, 2); @@ -877,7 +878,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) case MGSTONE_SANDSTONE: dp.c_wall = c_sandstonebrick; dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_sandstonebrick; + dp.c_stair = c_stair_sandstonebrick; dp.diagonal_dirs = false; dp.holesize = v3s16(2, 2, 2); diff --git a/src/mapgen.h b/src/mapgen.h index b18bfb930..a95e1942a 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -266,6 +266,7 @@ protected: content_t c_cobble; content_t c_stair_cobble; content_t c_mossycobble; + content_t c_stair_desert_stone; content_t c_sandstonebrick; content_t c_stair_sandstonebrick; From 2a8953107181b4df6ff55d0ae214490575609f49 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 26 Jan 2017 15:38:18 +0000 Subject: [PATCH 094/586] Dungeongen: Fix selection of diagonal corridors The do .. while loop is waiting for both dir.X and dir.Z to be non-zero, so should continue to loop if either dir.X or dir.Z are zero. The brackets present suggest this was intended to be OR not AND. --- src/dungeongen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp index b8ee2b924..7825e9e2c 100644 --- a/src/dungeongen.cpp +++ b/src/dungeongen.cpp @@ -622,7 +622,7 @@ v3s16 rand_ortho_dir(PseudoRandom &random, bool diagonal_dirs) dir.Z = random.next() % 3 - 1; dir.Y = 0; dir.X = random.next() % 3 - 1; - } while ((dir.X == 0 && dir.Z == 0) && trycount < 10); + } while ((dir.X == 0 || dir.Z == 0) && trycount < 10); return dir; } else { From b7a98e98500402c3bbdb6d56d0fe42b4f5b3cedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Fri, 27 Jan 2017 08:59:30 +0100 Subject: [PATCH 095/586] Implement player attribute backend (#4155) * This backend permit mods to store extra players attributes to a common interface. * Add the obj:set_attribute(attr, value) Lua call * Add the obj:get_attribute(attr) Lua call Examples: * player:set_attribute("home:home", "10,25,-78") * player:get_attribute("default:mana") Attributes are saved as a json in the player file in extended_attributes key They are saved only if a modification on the attributes occurs and loaded when emergePlayer is called (they are attached to PlayerSAO). --- doc/lua_api.txt | 2 ++ src/content_sao.cpp | 1 + src/content_sao.h | 37 +++++++++++++++++++++++++++++ src/remoteplayer.cpp | 38 +++++++++++++++++++++++++++--- src/remoteplayer.h | 5 +++- src/script/lua_api/l_object.cpp | 41 +++++++++++++++++++++++++++++++++ src/script/lua_api/l_object.h | 6 +++++ src/server.h | 1 - src/serverenvironment.cpp | 3 ++- 9 files changed, 128 insertions(+), 6 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 62a7b81f7..ee7d57c2f 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2899,6 +2899,8 @@ This is basically a reference to a C++ `ServerActiveObject` * `0`: player is drowning, * `1`-`10`: remaining number of bubbles * `11`: bubbles bar is not shown +* `set_attribute(attribute, value)`: sets an extra attribute with value on player +* `get_attribute(attribute)`: returns value for extra attribute. Returns nil if no attribute found. * `set_inventory_formspec(formspec)` * Redefine player's inventory form * Should usually be called in on_joinplayer diff --git a/src/content_sao.cpp b/src/content_sao.cpp index bb62aea7d..35133490e 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -791,6 +791,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer m_pitch(0), m_fov(0), m_wanted_range(0), + m_extended_attributes_modified(false), // public m_physics_override_speed(1), m_physics_override_jump(1), diff --git a/src/content_sao.h b/src/content_sao.h index c3674fa2d..bbf244742 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -180,6 +180,7 @@ public: } }; +typedef UNORDERED_MAP PlayerAttributes; class RemotePlayer; class PlayerSAO : public UnitSAO @@ -249,6 +250,39 @@ public: int getWieldIndex() const; void setWieldIndex(int i); + /* + Modding interface + */ + inline void setExtendedAttribute(const std::string &attr, const std::string &value) + { + m_extra_attributes[attr] = value; + m_extended_attributes_modified = true; + } + + inline bool getExtendedAttribute(const std::string &attr, std::string *value) + { + if (m_extra_attributes.find(attr) == m_extra_attributes.end()) + return false; + + *value = m_extra_attributes[attr]; + return true; + } + + inline const PlayerAttributes &getExtendedAttributes() + { + return m_extra_attributes; + } + + inline bool extendedAttributesModified() const + { + return m_extended_attributes_modified; + } + + inline void setExtendedAttributeModified(bool v) + { + m_extended_attributes_modified = v; + } + /* PlayerSAO-specific */ @@ -343,6 +377,9 @@ private: f32 m_pitch; f32 m_fov; s16 m_wanted_range; + + PlayerAttributes m_extra_attributes; + bool m_extended_attributes_modified; public: float m_physics_override_speed; float m_physics_override_jump; diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index 18bfa1030..6853ad6d9 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -19,13 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "remoteplayer.h" +#include #include "content_sao.h" #include "filesys.h" #include "gamedef.h" #include "porting.h" // strlcpy +#include "server.h" #include "settings.h" - /* RemotePlayer */ @@ -112,9 +113,23 @@ void RemotePlayer::save(std::string savedir, IGameDef *gamedef) } infostream << "Didn't find free file for player " << m_name << std::endl; - return; } +void RemotePlayer::serializeExtraAttributes(std::string &output) +{ + assert(m_sao); + Json::Value json_root; + const PlayerAttributes &attrs = m_sao->getExtendedAttributes(); + for (PlayerAttributes::const_iterator it = attrs.begin(); it != attrs.end(); ++it) { + json_root[(*it).first] = (*it).second; + } + + Json::FastWriter writer; + output = writer.write(json_root); + m_sao->setExtendedAttributeModified(false); +} + + void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao) { @@ -150,6 +165,20 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, try { sao->setBreath(args.getS32("breath"), false); } catch (SettingNotFoundException &e) {} + + try { + std::string extended_attributes = args.get("extended_attributes"); + Json::Reader reader; + Json::Value attr_root; + reader.parse(extended_attributes, attr_root); + + const Json::Value::Members attr_list = attr_root.getMemberNames(); + for (Json::Value::Members::const_iterator it = attr_list.begin(); + it != attr_list.end(); ++it) { + Json::Value attr_value = attr_root[*it]; + sao->setExtendedAttribute(*it, attr_value.asString()); + } + } catch (SettingNotFoundException &e) {} } inventory.deSerialize(is); @@ -175,7 +204,6 @@ void RemotePlayer::serialize(std::ostream &os) Settings args; args.setS32("version", 1); args.set("name", m_name); - //args.set("password", m_password); // This should not happen assert(m_sao); @@ -185,6 +213,10 @@ void RemotePlayer::serialize(std::ostream &os) args.setFloat("yaw", m_sao->getYaw()); args.setS32("breath", m_sao->getBreath()); + std::string extended_attrs = ""; + serializeExtraAttributes(extended_attrs); + args.set("extended_attributes", extended_attrs); + args.writeLines(os); os<<"PlayerArgsEnd\n"; diff --git a/src/remoteplayer.h b/src/remoteplayer.h index 61b5a23de..f44fb9332 100644 --- a/src/remoteplayer.h +++ b/src/remoteplayer.h @@ -25,11 +25,13 @@ with this program; if not, write to the Free Software Foundation, Inc., class PlayerSAO; -enum RemotePlayerChatResult { +enum RemotePlayerChatResult +{ RPLAYER_CHATRESULT_OK, RPLAYER_CHATRESULT_FLOODING, RPLAYER_CHATRESULT_KICK, }; + /* Player on the server */ @@ -135,6 +137,7 @@ private: deSerialize stops reading exactly at the right point. */ void serialize(std::ostream &os); + void serializeExtraAttributes(std::string &output); PlayerSAO *m_sao; bool m_dirty; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index be4451704..9352812ab 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1181,6 +1181,45 @@ int ObjectRef::l_get_breath(lua_State *L) return 1; } +// set_attribute(self, attribute, value) +int ObjectRef::l_set_attribute(lua_State *L) +{ + ObjectRef *ref = checkobject(L, 1); + PlayerSAO* co = getplayersao(ref); + if (co == NULL) { + return 0; + } + + std::string attr = luaL_checkstring(L, 2); + std::string value = luaL_checkstring(L, 3); + + if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + co->setExtendedAttribute(attr, value); + } + return 1; +} + +// get_attribute(self, attribute) +int ObjectRef::l_get_attribute(lua_State *L) +{ + ObjectRef *ref = checkobject(L, 1); + PlayerSAO* co = getplayersao(ref); + if (co == NULL) { + return 0; + } + + std::string attr = luaL_checkstring(L, 2); + + std::string value = ""; + if (co->getExtendedAttribute(attr, &value)) { + lua_pushstring(L, value.c_str()); + return 1; + } + + return 0; +} + + // set_inventory_formspec(self, formspec) int ObjectRef::l_set_inventory_formspec(lua_State *L) { @@ -1839,6 +1878,8 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, set_look_pitch), luamethod(ObjectRef, get_breath), luamethod(ObjectRef, set_breath), + luamethod(ObjectRef, get_attribute), + luamethod(ObjectRef, set_attribute), luamethod(ObjectRef, set_inventory_formspec), luamethod(ObjectRef, get_inventory_formspec), luamethod(ObjectRef, get_player_control), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 96d0abae8..2c9aa559a 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -226,6 +226,12 @@ private: // get_breath(self, breath) static int l_get_breath(lua_State *L); + // set_attribute(self, attribute, value) + static int l_set_attribute(lua_State *L); + + // get_attribute(self, attribute) + static int l_get_attribute(lua_State *L); + // set_inventory_formspec(self, formspec) static int l_set_inventory_formspec(lua_State *L); diff --git a/src/server.h b/src/server.h index e5121bdc3..8f553ce38 100644 --- a/src/server.h +++ b/src/server.h @@ -576,7 +576,6 @@ private: float m_time_of_day_send_timer; // Uptime of server in seconds MutexedVariable m_uptime; - /* Client interface */ diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 01dc3ff10..7a5cfafd6 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -500,7 +500,8 @@ void ServerEnvironment::saveLoadedPlayers() for (std::vector::iterator it = m_players.begin(); it != m_players.end(); ++it) { - if ((*it)->checkModified()) { + if ((*it)->checkModified() || + ((*it)->getPlayerSAO() && (*it)->getPlayerSAO()->extendedAttributesModified())) { (*it)->save(players_path, m_server); } } From 953cbb3b15997a0e7c7c32af2365cb5046a9e476 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sat, 28 Jan 2017 10:07:35 +0000 Subject: [PATCH 096/586] Plantlike: Fix visual_scale being applied squared (#5115) Visual_scale was applied twice to plantlike by accident sometime between 2011 and 2013, squaring the requested scale value. Visual_scale is correctly applied once in it's other uses in signlike and torchlike. Two lines of code are removed, they also had no effect for the vast majority of nodes with the default visual_scale of 1.0. The texture continues to have it's base at ground level. --- src/content_mapblock.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 45822666f..9923647bc 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -1602,8 +1602,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, } for (int i = 0; i < 4; i++) { - vertices[i].Pos *= f.visual_scale; - vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1); if (data->m_smooth_lighting) vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); From 814ee971f70a8ef1fa4a470bcf385300686e9e70 Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 21 Jan 2017 15:58:07 +0100 Subject: [PATCH 097/586] Make entity on_punch have same signature and behaviour as player on_punch --- doc/lua_api.txt | 5 ++++- src/content_sao.cpp | 32 ++++++++++++++++++-------------- src/script/cpp_api/s_entity.cpp | 15 +++++++++------ src/script/cpp_api/s_entity.h | 4 ++-- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index ee7d57c2f..ff745c1c2 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1392,7 +1392,7 @@ a non-tool item, so that it can do something else than take damage. On the Lua side, every punch calls: - entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction, damage) This should never be called directly, because damage is usually not handled by the entity itself. @@ -1403,6 +1403,9 @@ the entity itself. * `tool_capabilities` can be `nil`. * `direction` is a unit vector, pointing from the source of the punch to the punched object. +* `damage` damage that will be done to entity +Return value of this function will determin if damage is done by this function +(retval true) or shall be done by engine (retval false) To punch an entity/object in Lua, call: diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 35133490e..7a1171eb7 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -578,28 +578,32 @@ int LuaEntitySAO::punch(v3f dir, punchitem, time_from_last_punch); - if (result.did_punch) { - setHP(getHP() - result.damage); + bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, + time_from_last_punch, toolcap, dir, result.did_punch ? result.damage : 0); - if (result.damage > 0) { - std::string punchername = puncher ? puncher->getDescription() : "nil"; + if (!damage_handled) { + if (result.did_punch) { + setHP(getHP() - result.damage); - actionstream << getDescription() << " punched by " - << punchername << ", damage " << result.damage - << " hp, health now " << getHP() << " hp" << std::endl; + if (result.damage > 0) { + std::string punchername = puncher ? puncher->getDescription() : "nil"; + + actionstream << getDescription() << " punched by " + << punchername << ", damage " << result.damage + << " hp, health now " << getHP() << " hp" << std::endl; + } + + std::string str = gob_cmd_punched(result.damage, getHP()); + // create message and add to list + ActiveObjectMessage aom(getId(), true, str); + m_messages_out.push(aom); } - - std::string str = gob_cmd_punched(result.damage, getHP()); - // create message and add to list - ActiveObjectMessage aom(getId(), true, str); - m_messages_out.push(aom); } if (getHP() == 0) m_removed = true; - m_env->getScriptIface()->luaentity_Punch(m_id, puncher, - time_from_last_punch, toolcap, dir); + return result.wear; } diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp index 378a6bf09..fcd8dd4a0 100644 --- a/src/script/cpp_api/s_entity.cpp +++ b/src/script/cpp_api/s_entity.cpp @@ -224,10 +224,10 @@ void ScriptApiEntity::luaentity_Step(u16 id, float dtime) } // Calls entity:on_punch(ObjectRef puncher, time_from_last_punch, -// tool_capabilities, direction) -void ScriptApiEntity::luaentity_Punch(u16 id, +// tool_capabilities, direction, damage) +bool ScriptApiEntity::luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir) + const ToolCapabilities *toolcap, v3f dir, s16 damage) { SCRIPTAPI_PRECHECKHEADER @@ -242,8 +242,8 @@ void ScriptApiEntity::luaentity_Punch(u16 id, // Get function lua_getfield(L, -1, "on_punch"); if (lua_isnil(L, -1)) { - lua_pop(L, 2); // Pop on_punch and entitu - return; + lua_pop(L, 2); // Pop on_punch and entity + return false; } luaL_checktype(L, -1, LUA_TFUNCTION); lua_pushvalue(L, object); // self @@ -251,11 +251,14 @@ void ScriptApiEntity::luaentity_Punch(u16 id, lua_pushnumber(L, time_from_last_punch); push_tool_capabilities(L, *toolcap); push_v3f(L, dir); + lua_pushnumber(L, damage); setOriginFromTable(object); - PCALL_RES(lua_pcall(L, 5, 0, error_handler)); + PCALL_RES(lua_pcall(L, 6, 0, error_handler)); + bool retval = lua_toboolean(L, -1); lua_pop(L, 2); // Pop object and error handler + return retval; } // Calls entity:on_rightclick(ObjectRef clicker) diff --git a/src/script/cpp_api/s_entity.h b/src/script/cpp_api/s_entity.h index 8df9d7f00..4e2a056bb 100644 --- a/src/script/cpp_api/s_entity.h +++ b/src/script/cpp_api/s_entity.h @@ -38,9 +38,9 @@ public: void luaentity_GetProperties(u16 id, ObjectProperties *prop); void luaentity_Step(u16 id, float dtime); - void luaentity_Punch(u16 id, + bool luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir); + const ToolCapabilities *toolcap, v3f dir, s16 damage); void luaentity_Rightclick(u16 id, ServerActiveObject *clicker); }; From 79d752ba4f6f0197627cc20f99b2540f63b6dc88 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 2 Jan 2017 15:17:28 +0100 Subject: [PATCH 098/586] from_table: Fix crash for missing inventory or field --- doc/lua_api.txt | 3 +- src/script/lua_api/l_nodemeta.cpp | 46 ++++++++++++++++++------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index ff745c1c2..9a1cb6bac 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2781,8 +2781,9 @@ Can be gotten via `minetest.get_meta(pos)`. * `get_inventory()`: returns `InvRef` * `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}` * `from_table(nil or {})` - * to clear metadata, use from_table(nil) + * Any non-table value will clear the metadata * See "Node Metadata" + * returns `true` on success ### `NodeTimerRef` Node Timers: a high resolution persistent per-node timer. diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 3d03c0c41..631aa68ce 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -250,7 +250,7 @@ int NodeMetaRef::l_from_table(lua_State *L) // clear old metadata first ref->m_env->getMap().removeNodeMetadata(ref->m_p); - if(lua_isnil(L, base)){ + if (!lua_istable(L, base)) { // No metadata lua_pushboolean(L, true); return 1; @@ -258,34 +258,42 @@ int NodeMetaRef::l_from_table(lua_State *L) // Create new metadata NodeMetadata *meta = getmeta(ref, true); - if(meta == NULL){ + if (meta == NULL) { lua_pushboolean(L, false); return 1; } + // Set fields lua_getfield(L, base, "fields"); - int fieldstable = lua_gettop(L); - lua_pushnil(L); - while(lua_next(L, fieldstable) != 0){ - // key at index -2 and value at index -1 - std::string name = lua_tostring(L, -2); - size_t cl; - const char *cs = lua_tolstring(L, -1, &cl); - std::string value(cs, cl); - meta->setString(name, value); - lua_pop(L, 1); // removes value, keeps key for next iteration + if (lua_istable(L, -1)) { + int fieldstable = lua_gettop(L); + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string name = lua_tostring(L, -2); + size_t cl; + const char *cs = lua_tolstring(L, -1, &cl); + meta->setString(name, std::string(cs, cl)); + lua_pop(L, 1); // Remove value, keep key for next iteration + } + lua_pop(L, 1); } + // Set inventory Inventory *inv = meta->getInventory(); lua_getfield(L, base, "inventory"); - int inventorytable = lua_gettop(L); - lua_pushnil(L); - while(lua_next(L, inventorytable) != 0){ - // key at index -2 and value at index -1 - std::string name = lua_tostring(L, -2); - read_inventory_list(L, -1, inv, name.c_str(), getServer(L)); - lua_pop(L, 1); // removes value, keeps key for next iteration + if (lua_istable(L, -1)) { + int inventorytable = lua_gettop(L); + lua_pushnil(L); + while (lua_next(L, inventorytable) != 0) { + // key at index -2 and value at index -1 + std::string name = lua_tostring(L, -2); + read_inventory_list(L, -1, inv, name.c_str(), getServer(L)); + lua_pop(L, 1); // Remove value, keep key for next iteration + } + lua_pop(L, 1); } + reportMetadataChange(ref); lua_pushboolean(L, true); return 1; From c93f7f5ceaf255bc9314be022b7bebb55b1d0605 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sat, 28 Jan 2017 17:02:43 -0500 Subject: [PATCH 099/586] Fix synchronization issue at thread start If a newly spawned thread called getThreadId or getThreadHandle before the spawning thread finished saving the thread handle, then the handle/id would be used uninitialized. This would cause the threading tests to fail since isCurrentThread would return false, and if Minetest is built with C++11 support the std::thread object pointer would be dereferenced while ininitialized, causing a segmentation fault. This fixes the issue by using a mutex to force the spawned thread to wait for the spawning thread to finish initializing the thread object. An alternative way to handle this would be to also set the thread handle/id in the started thread but this wouldn't work for C++11 builds because there's no way to get the partially constructed object. --- src/threading/mutex.cpp | 9 +++++++++ src/threading/mutex.h | 2 ++ src/threading/thread.cpp | 15 +++++++++++++++ src/threading/thread.h | 1 + src/unittest/test_threading.cpp | 2 -- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp index 0908b5d37..d864f12c5 100644 --- a/src/threading/mutex.cpp +++ b/src/threading/mutex.cpp @@ -88,6 +88,15 @@ void Mutex::lock() #endif } +bool Mutex::try_lock() +{ +#if USE_WIN_MUTEX + return TryEnterCriticalSection(&mutex) != 0; +#else + return pthread_mutex_trylock(&mutex) == 0; +#endif +} + void Mutex::unlock() { #if USE_WIN_MUTEX diff --git a/src/threading/mutex.h b/src/threading/mutex.h index fb5c029fc..6feb23c25 100644 --- a/src/threading/mutex.h +++ b/src/threading/mutex.h @@ -56,6 +56,8 @@ public: void lock(); void unlock(); + bool try_lock(); + protected: Mutex(bool recursive); void init_mutex(bool recursive); diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index fbe4ba1f3..4f4c9474a 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -101,6 +101,11 @@ Thread::Thread(const std::string &name) : Thread::~Thread() { kill(); + + // Make sure start finished mutex is unlocked before it's destroyed + m_start_finished_mutex.try_lock(); + m_start_finished_mutex.unlock(); + } @@ -113,6 +118,9 @@ bool Thread::start() m_request_stop = false; + // The mutex may already be locked if the thread is being restarted + m_start_finished_mutex.try_lock(); + #if USE_CPP11_THREADS try { @@ -135,6 +143,9 @@ bool Thread::start() #endif + // Allow spawned thread to continue + m_start_finished_mutex.unlock(); + while (!m_running) sleep_ms(1); @@ -249,6 +260,10 @@ DWORD WINAPI Thread::threadProc(LPVOID param) g_logger.registerThread(thr->m_name); thr->m_running = true; + // Wait for the thread that started this one to finish initializing the + // thread handle so that getThreadId/getThreadHandle will work. + thr->m_start_finished_mutex.lock(); + thr->m_retval = thr->run(); thr->m_running = false; diff --git a/src/threading/thread.h b/src/threading/thread.h index 14a0e13ab..4785d3e03 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -153,6 +153,7 @@ private: Atomic m_request_stop; Atomic m_running; Mutex m_mutex; + Mutex m_start_finished_mutex; #if USE_CPP11_THREADS std::thread *m_thread_obj; diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp index cdbf9674e..e1e1d3660 100644 --- a/src/unittest/test_threading.cpp +++ b/src/unittest/test_threading.cpp @@ -39,9 +39,7 @@ static TestThreading g_test_instance; void TestThreading::runTests(IGameDef *gamedef) { -#if !(defined(__MACH__) && defined(__APPLE__)) TEST(testStartStopWait); -#endif TEST(testThreadKill); TEST(testAtomicSemaphoreThread); } From 3eecc6ff4492ca21772544451fd8aa78871bac3b Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sat, 28 Jan 2017 17:23:30 -0500 Subject: [PATCH 100/586] Fix AIX threading build --- src/threading/thread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index 4f4c9474a..1909da61d 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -252,7 +252,7 @@ DWORD WINAPI Thread::threadProc(LPVOID param) Thread *thr = (Thread *)param; #ifdef _AIX - m_kernel_thread_id = thread_self(); + thr->m_kernel_thread_id = thread_self(); #endif thr->setName(thr->m_name); From 707e27b5c26b6c082abbd2f385a976c5bc8964fe Mon Sep 17 00:00:00 2001 From: Zeno- Date: Sun, 29 Jan 2017 19:26:00 +1000 Subject: [PATCH 101/586] Rename height to scale for openConsole() (#5139) For Game::openConsole() and GUIChatConsole::openConsole() the parameter name 'height' is misleading because it's actually a percentage of the screen/window height. --- src/game.cpp | 8 +++++--- src/guiChatConsole.cpp | 8 +++++--- src/guiChatConsole.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index 07d429c6b..4b4597a7a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1372,7 +1372,7 @@ protected: void dropSelectedItem(); void openInventory(); - void openConsole(float height, const wchar_t *line=NULL); + void openConsole(float scale, const wchar_t *line=NULL); void toggleFreeMove(float *statustext_time); void toggleFreeMoveAlt(float *statustext_time, float *jump_timer); void toggleFast(float *statustext_time); @@ -2779,15 +2779,17 @@ void Game::openInventory() } -void Game::openConsole(float height, const wchar_t *line) +void Game::openConsole(float scale, const wchar_t *line) { + assert(scale > 0.0f && scale <= 1.0f); + #ifdef __ANDROID__ porting::showInputDialog(gettext("ok"), "", "", 2); m_android_chat_open = true; #else if (gui_chat_console->isOpenInhibited()) return; - gui_chat_console->openConsole(height); + gui_chat_console->openConsole(scale); if (line) { gui_chat_console->setCloseOnEnter(true); gui_chat_console->replaceAndAddToHistory(line); diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp index 867576175..bea5571f4 100644 --- a/src/guiChatConsole.cpp +++ b/src/guiChatConsole.cpp @@ -116,11 +116,13 @@ GUIChatConsole::~GUIChatConsole() m_font->drop(); } -void GUIChatConsole::openConsole(f32 height) +void GUIChatConsole::openConsole(f32 scale) { + assert(scale > 0.0f && scale <= 1.0f); + m_open = true; - m_desired_height_fraction = height; - m_desired_height = height * m_screensize.Y; + m_desired_height_fraction = scale; + m_desired_height = scale * m_screensize.Y; reformatConsole(); m_animate_time_old = getTimeMs(); IGUIElement::setVisible(true); diff --git a/src/guiChatConsole.h b/src/guiChatConsole.h index 3013a1d31..4e3cae13f 100644 --- a/src/guiChatConsole.h +++ b/src/guiChatConsole.h @@ -41,7 +41,7 @@ public: // Open the console (height = desired fraction of screen size) // This doesn't open immediately but initiates an animation. // You should call isOpenInhibited() before this. - void openConsole(f32 height); + void openConsole(f32 scale); bool isOpen() const; From 0c9189d10989f85cd5148107b643dc17a49c06ff Mon Sep 17 00:00:00 2001 From: Ezhh Date: Sun, 29 Jan 2017 16:10:17 +0000 Subject: [PATCH 102/586] Add console height setting (#5136) --- builtin/settingtypes.txt | 3 +++ minetest.conf.example | 4 ++++ src/defaultsettings.cpp | 1 + src/game.cpp | 3 ++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 581eef315..c81dde7de 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -477,6 +477,9 @@ fall_bobbing_amount (Fall bobbing) float 0.0 # - pageflip: quadbuffer based 3d. 3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,pageflip +# In-game chat console height, between 0.1 (10%) and 1.0 (100%). +console_height (Console height) float 1.0 0.1 1.0 + # In-game chat console background color (R,G,B). console_color (Console color) string (0,0,0) diff --git a/minetest.conf.example b/minetest.conf.example index 642b028c7..5c7533e93 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -548,6 +548,10 @@ # type: enum values: none, anaglyph, interlaced, topbottom, sidebyside, pageflip # 3d_mode = none +# In-game chat console height, between 0.1 (10%) and 1.0 (100%). +# type: float +# console_height = 1.0 + # In-game chat console background color (R,G,B). # type: string # console_color = (0,0,0) diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index e154a63c8..84046f61c 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -138,6 +138,7 @@ void set_default_settings(Settings *settings) settings->setDefault("cloud_radius", "12"); settings->setDefault("menu_clouds", "true"); settings->setDefault("opaque_water", "false"); + settings->setDefault("console_height", "1.0"); settings->setDefault("console_color", "(0,0,0)"); settings->setDefault("console_alpha", "200"); settings->setDefault("selectionbox_color", "(0,0,0)"); diff --git a/src/game.cpp b/src/game.cpp index 4b4597a7a..1cb054cab 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2627,7 +2627,8 @@ void Game::processKeyInput(VolatileRunFlags *flags, } else if (wasKeyDown(KeyType::CMD)) { openConsole(0.2, L"/"); } else if (wasKeyDown(KeyType::CONSOLE)) { - openConsole(1); + openConsole(core::clamp( + g_settings->getFloat("console_height"), 0.1f, 1.0f)); } else if (wasKeyDown(KeyType::FREEMOVE)) { toggleFreeMove(statustext_time); } else if (wasKeyDown(KeyType::JUMP)) { From f0e3abc64d1c79c024f588e6d7ccd27e021c4a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Mon, 30 Jan 2017 02:47:36 +0100 Subject: [PATCH 103/586] Re-add halo highlight (#5130) Due to a rebase mistake halo highlighting was disabled. This commit re-adds that feature. --- src/game.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/game.cpp b/src/game.cpp index 1cb054cab..840403c42 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3697,6 +3697,7 @@ PointedThing Game::updatePointedThing( { std::vector *selectionboxes = hud->getSelectionBoxes(); selectionboxes->clear(); + hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0)); static const bool show_entity_selectionbox = g_settings->getBool( "show_entity_selectionbox"); @@ -3741,6 +3742,10 @@ PointedThing Game::updatePointedThing( } hud->setSelectionPos(intToFloat(result.node_undersurface, BS), camera_offset); + hud->setSelectedFaceNormal(v3f( + result.intersection_normal.X, + result.intersection_normal.Y, + result.intersection_normal.Z)); } // Update selection mesh light level and vertex colors From 6642c8583a8635a5d61f11ca53254b4ae03d9c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Mon, 30 Jan 2017 08:18:18 +0100 Subject: [PATCH 104/586] Use fabs() instead of abs() (#5141) --- src/mapblock_mesh.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 79d02d6ff..2520b5459 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -1090,9 +1090,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): brightness of vertices 1 and 3 differ less than the brightness of vertices 0 and 2. */ - if (abs(f.vertices[0].Color.getLuminance() + if (fabs(f.vertices[0].Color.getLuminance() - f.vertices[2].Color.getLuminance()) - > abs(f.vertices[1].Color.getLuminance() + > fabs(f.vertices[1].Color.getLuminance() - f.vertices[3].Color.getLuminance())) indices_p = indices_alternate; From e761b9f48626db2af8b62a0cf85691208951cf0d Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 14 Jan 2017 23:16:58 +0100 Subject: [PATCH 105/586] Add multiply texture modifier Allows colorizing of textures using a color multiplication method. --- doc/lua_api.txt | 7 ++++++ src/client/tile.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9a1cb6bac..219882f46 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -419,6 +419,13 @@ the word "`alpha`", then each texture pixel will contain the RGB of `` and the alpha of `` multiplied by the alpha of the texture pixel. +#### `[multiply:` +Multiplies texture colors with the given color. +`` is specified as a `ColorString`. +Result is more like what you'd expect if you put a color on top of another +color. Meaning white surfaces get a lot of your new color while black parts don't +change very much. + Sounds ------ Only Ogg Vorbis files are supported. diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 539c29445..fbc0f1709 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -555,7 +555,11 @@ static void blit_with_alpha_overlay(video::IImage *src, video::IImage *dst, // color alpha with the destination alpha. // Otherwise, any pixels that are not fully transparent get the color alpha. static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, - video::SColor color, int ratio, bool keep_alpha); + const video::SColor &color, int ratio, bool keep_alpha); + +// paint a texture using the given color +static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, + const video::SColor &color); // Apply a mask to an image static void apply_mask(video::IImage *mask, video::IImage *dst, @@ -1656,6 +1660,30 @@ bool TextureSource::generateImagePart(std::string part_of_name, << filename << "\"."; } } + /* + [multiply:color + multiplys a given color to any pixel of an image + color = color as ColorString + */ + else if (str_starts_with(part_of_name, "[multiply:")) { + Strfnd sf(part_of_name); + sf.next(":"); + std::string color_str = sf.next(":"); + + if (baseimg == NULL) { + errorstream << "generateImagePart(): baseimg != NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + video::SColor color; + + if (!parseColorString(color_str, color, false)) + return false; + + apply_multiplication(baseimg, v2u32(0, 0), baseimg->getDimension(), color); + } /* [colorize:color Overlays image with given color @@ -1960,7 +1988,7 @@ static void blit_with_interpolate_overlay(video::IImage *src, video::IImage *dst Apply color to destination */ static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, - video::SColor color, int ratio, bool keep_alpha) + const video::SColor &color, int ratio, bool keep_alpha) { u32 alpha = color.getAlpha(); video::SColor dst_c; @@ -1994,6 +2022,27 @@ static void apply_colorize(video::IImage *dst, v2u32 dst_pos, v2u32 size, } } +/* + Apply color to destination +*/ +static void apply_multiplication(video::IImage *dst, v2u32 dst_pos, v2u32 size, + const video::SColor &color) +{ + video::SColor dst_c; + + for (u32 y = dst_pos.Y; y < dst_pos.Y + size.Y; y++) + for (u32 x = dst_pos.X; x < dst_pos.X + size.X; x++) { + dst_c = dst->getPixel(x, y); + dst_c.set( + dst_c.getAlpha(), + (dst_c.getRed() * color.getRed()) / 255, + (dst_c.getGreen() * color.getGreen()) / 255, + (dst_c.getBlue() * color.getBlue()) / 255 + ); + dst->setPixel(x, y, dst_c); + } +} + /* Apply mask to destination */ From cdc538e0a242167cd7031d40670d2d4464b87f2c Mon Sep 17 00:00:00 2001 From: paramat Date: Sun, 29 Jan 2017 06:29:40 +0000 Subject: [PATCH 106/586] Plantlike visual scale: Send sqrt(visual_scale) to old clients Keep compatibility with protocol < 30 clients now that visual_scale is no longer applied twice to plantlike drawtype and mods are being updated to a new value. --- src/network/networkprotocol.h | 2 ++ src/nodedef.cpp | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index a511d169b..5301cc91c 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -146,6 +146,8 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL VERSION 30: New ContentFeatures serialization version Add node and tile color and palette + Fix plantlike visual_scale being applied squared and add compatibility + with pre-30 clients by sending sqrt(visual_scale) */ #define LATEST_PROTOCOL_VERSION 30 diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 0bb150267..c717b62b9 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -1611,6 +1611,10 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const compatible_param_type_2 = CPT2_WALLMOUNTED; } + float compatible_visual_scale = visual_scale; + if (protocol_version < 30 && drawtype == NDT_PLANTLIKE) + compatible_visual_scale = sqrt(visual_scale); + if (protocol_version == 13) { writeU8(os, 5); // version @@ -1622,7 +1626,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1670,7 +1674,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1724,7 +1728,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); From 74afe6fe6bf5bd6eeba3b6f4fbbfbe8758e7f750 Mon Sep 17 00:00:00 2001 From: numberZero Date: Tue, 31 Jan 2017 11:42:39 +0400 Subject: [PATCH 107/586] Fix fog weirdness (#5146) --- client/shaders/nodes_shader/opengl_fragment.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 914f9f873..7c5b9b613 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -37,7 +37,7 @@ const float fogShadingParameter = 1 / ( 1 - fogStart); vec3 uncharted2Tonemap(vec3 x) { - return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03334; + return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333; } vec4 applyToneMapping(vec4 color) From 3e355ab7d5ccdcd77f104eee57237828410b85d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20Courant?= Date: Wed, 1 Feb 2017 00:02:30 +0100 Subject: [PATCH 108/586] Make facedir_to_dir and wallmounted_to_dir work with coloured nodes as well. (#5153) --- builtin/game/item.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/game/item.lua b/builtin/game/item.lua index e51da6d6b..a8dc51d61 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -109,7 +109,7 @@ local facedir_to_dir_map = { 1, 4, 3, 2, } function core.facedir_to_dir(facedir) - return facedir_to_dir[facedir_to_dir_map[facedir]] + return facedir_to_dir[facedir_to_dir_map[facedir % 32]] end function core.dir_to_wallmounted(dir) @@ -144,7 +144,7 @@ local wallmounted_to_dir = { {x = 0, y = 0, z = -1}, } function core.wallmounted_to_dir(wallmounted) - return wallmounted_to_dir[wallmounted] + return wallmounted_to_dir[wallmounted % 8] end function core.dir_to_yaw(dir) From d873545ac70331a224967493f9296a854d292dd8 Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Mon, 30 Jan 2017 07:58:43 +0100 Subject: [PATCH 109/586] Fix anticheat resetting client position after the client is teleported Previously, m_move_pool could accomodate the client moving from the new position to the old one, and the server accepted the client to go back to its old position. However, it couldn't then accomodate the client moving from its old to its new position, and therefore would reset position to the old position. Thus, by emptying m_move_pool after a teleport, the server no longer accepts the client to go back to its old position. A drawback is however that a laggy client *will* trigger a few "moved_too_fast" anticheats before being told about its new position. Don't report player cheated if caused by lag. Fixes #5118 --- src/content_sao.cpp | 19 +++++++++++++++---- src/content_sao.h | 9 +++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 7a1171eb7..f87977f80 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -785,6 +785,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer m_inventory(NULL), m_damage(0), m_last_good_position(0,0,0), + m_time_from_last_teleport(0), m_time_from_last_punch(0), m_nocheat_dig_pos(32767, 32767, 32767), m_nocheat_dig_time(0), @@ -1000,6 +1001,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) // Increment cheat prevention timers m_dig_pool.add(dtime); m_move_pool.add(dtime); + m_time_from_last_teleport += dtime; m_time_from_last_punch += dtime; m_nocheat_dig_time += dtime; @@ -1106,6 +1108,8 @@ void PlayerSAO::setPos(const v3f &pos) setBasePosition(pos); // Movement caused by this command is always valid m_last_good_position = pos; + m_move_pool.empty(); + m_time_from_last_teleport = 0.0; m_env->getGameDef()->SendMovePlayer(m_peer_id); } @@ -1117,6 +1121,8 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) setBasePosition(pos); // Movement caused by this command is always valid m_last_good_position = pos; + m_move_pool.empty(); + m_time_from_last_teleport = 0.0; m_env->getGameDef()->SendMovePlayer(m_peer_id); } @@ -1405,11 +1411,16 @@ bool PlayerSAO::checkMovementCheat() if (m_move_pool.grab(required_time)) { m_last_good_position = m_base_position; } else { - actionstream << "Player " << m_player->getName() - << " moved too fast; resetting position" - << std::endl; + const float LAG_POOL_MIN = 5.0; + float lag_pool_max = m_env->getMaxLagEstimate() * 2.0; + lag_pool_max = MYMAX(lag_pool_max, LAG_POOL_MIN); + if (m_time_from_last_teleport > lag_pool_max) { + actionstream << "Player " << m_player->getName() + << " moved too fast; resetting position" + << std::endl; + cheated = true; + } setBasePosition(m_last_good_position); - cheated = true; } return cheated; } diff --git a/src/content_sao.h b/src/content_sao.h index bbf244742..1ccea0d78 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -157,18 +157,26 @@ class LagPool public: LagPool(): m_pool(15), m_max(15) {} + void setMax(float new_max) { m_max = new_max; if(m_pool > new_max) m_pool = new_max; } + void add(float dtime) { m_pool -= dtime; if(m_pool < 0) m_pool = 0; } + + void empty() + { + m_pool = m_max; + } + bool grab(float dtime) { if(dtime <= 0) @@ -358,6 +366,7 @@ private: LagPool m_dig_pool; LagPool m_move_pool; v3f m_last_good_position; + float m_time_from_last_teleport; float m_time_from_last_punch; v3s16 m_nocheat_dig_pos; float m_nocheat_dig_time; From 326cc5df741120dcfdfef21a7acaef5322601764 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 30 Jan 2017 18:06:17 +0000 Subject: [PATCH 110/586] Mgvalleys: Fix missing decorations and incorrect function order Fix missing decorations at horizontal chunk borders by adding 'updateHeightmap()' after terrain generation. Swap order of 'calculateNoise' and 'calcBiomeNoise' because 'calculateNoise' modifies the heat and humidity maps created in 'calcBiomeNoise'. Remove confusing comment, code block is not just for mods and seems essential for correct mapgen behaviour. --- src/mapgen_valleys.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp index ce7a95329..ccf797eff 100644 --- a/src/mapgen_valleys.cpp +++ b/src/mapgen_valleys.cpp @@ -238,17 +238,21 @@ void MapgenValleys::makeChunk(BlockMakeData *data) blockseed = getBlockSeed2(full_node_min, seed); - // Generate noise maps and base terrain height. - calculateNoise(); - // Generate biome noises. Note this must be executed strictly before // generateTerrain, because generateTerrain depends on intermediate // biome-related noises. m_bgen->calcBiomeNoise(node_min); + // Generate noise maps and base terrain height. + // Modify heat and humidity maps. + calculateNoise(); + // Generate base terrain with initial heightmaps s16 stone_surface_max_y = generateTerrain(); + // Recalculate heightmap + updateHeightmap(node_min, node_max); + // Place biome-specific nodes and build biomemap MgStoneType stone_type = generateBiomes(); @@ -549,10 +553,6 @@ int MapgenValleys::generateTerrain() index_3d += ystride; } - // This happens if we're generating a chunk that doesn't - // contain the terrain surface, in which case, we need - // to set heightmap to a value outside of the chunk, - // to avoid confusing lua mods that use heightmap. if (heightmap[index_2d] == -MAX_MAP_GENERATION_LIMIT) { s16 surface_y_int = myround(surface_y); if (surface_y_int > node_max.Y + 1 || surface_y_int < node_min.Y - 1) { From 3b9ae409c7d7e9445099b86c85392dba4771e08a Mon Sep 17 00:00:00 2001 From: Duane Robertson Date: Mon, 30 Jan 2017 22:37:04 -0600 Subject: [PATCH 111/586] Tell on_punch to expect a return value The return value should be interpreted as a boolean saying whether the lua on_punch function handled damage or the system needs to. --- src/script/cpp_api/s_entity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp index fcd8dd4a0..9e2193970 100644 --- a/src/script/cpp_api/s_entity.cpp +++ b/src/script/cpp_api/s_entity.cpp @@ -254,7 +254,7 @@ bool ScriptApiEntity::luaentity_Punch(u16 id, lua_pushnumber(L, damage); setOriginFromTable(object); - PCALL_RES(lua_pcall(L, 6, 0, error_handler)); + PCALL_RES(lua_pcall(L, 6, 1, error_handler)); bool retval = lua_toboolean(L, -1); lua_pop(L, 2); // Pop object and error handler From 03b34cb3dd0647b3e378f00cdc7203e580c9dcc8 Mon Sep 17 00:00:00 2001 From: kilbith Date: Fri, 3 Feb 2017 14:53:43 +0100 Subject: [PATCH 112/586] Serverlist: Add ping indicators (#5164) --- builtin/mainmenu/common.lua | 21 ++++++++++++++++++++- builtin/mainmenu/tab_multiplayer.lua | 1 + builtin/mainmenu/tab_simple_main.lua | 1 + src/script/lua_api/l_mainmenu.cpp | 7 +++++++ textures/base/pack/server_ping_1.png | Bin 0 -> 251 bytes textures/base/pack/server_ping_2.png | Bin 0 -> 244 bytes textures/base/pack/server_ping_3.png | Bin 0 -> 245 bytes textures/base/pack/server_ping_4.png | Bin 0 -> 213 bytes 8 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 textures/base/pack/server_ping_1.png create mode 100644 textures/base/pack/server_ping_2.png create mode 100644 textures/base/pack/server_ping_3.png create mode 100644 textures/base/pack/server_ping_4.png diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua index 5e3df0864..17d910e8b 100644 --- a/builtin/mainmenu/common.lua +++ b/builtin/mainmenu/common.lua @@ -54,7 +54,11 @@ end function image_column(tooltip, flagname) return "image,tooltip=" .. core.formspec_escape(tooltip) .. "," .. "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. - "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_" .. flagname .. ".png") + "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_" .. flagname .. ".png") .. "," .. + "2=" .. core.formspec_escape(defaulttexturedir .. "server_ping_4.png") .. "," .. + "3=" .. core.formspec_escape(defaulttexturedir .. "server_ping_3.png") .. "," .. + "4=" .. core.formspec_escape(defaulttexturedir .. "server_ping_2.png") .. "," .. + "5=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") end -------------------------------------------------------------------------------- @@ -97,6 +101,21 @@ function render_serverlist_row(spec, is_favorite) details = "0," end + if spec.ping then + local ping = spec.ping * 1000 + if ping <= 50 then + details = details .. "2," + elseif ping <= 100 then + details = details .. "3," + elseif ping <= 250 then + details = details .. "4," + else + details = details .. "5," + end + else + details = details .. "0," + end + if spec.clients and spec.clients_max then local clients_color = '' local clients_percent = 100 * spec.clients / spec.clients_max diff --git a/builtin/mainmenu/tab_multiplayer.lua b/builtin/mainmenu/tab_multiplayer.lua index f8edeaddd..033ba38d8 100644 --- a/builtin/mainmenu/tab_multiplayer.lua +++ b/builtin/mainmenu/tab_multiplayer.lua @@ -69,6 +69,7 @@ local function get_formspec(tabview, name, tabdata) --favourites retval = retval .. "tablecolumns[" .. image_column(fgettext("Favorite"), "favorite") .. ";" .. + image_column(fgettext("Ping"), "") .. ",padding=0.25;" .. "color,span=3;" .. "text,align=right;" .. -- clients "text,align=center,padding=0.25;" .. -- "/" diff --git a/builtin/mainmenu/tab_simple_main.lua b/builtin/mainmenu/tab_simple_main.lua index a773a4912..23820aab7 100644 --- a/builtin/mainmenu/tab_simple_main.lua +++ b/builtin/mainmenu/tab_simple_main.lua @@ -43,6 +43,7 @@ local function get_formspec(tabview, name, tabdata) retval = retval .. "tablecolumns[" .. image_column(fgettext("Favorite"), "favorite") .. ";" .. + image_column(fgettext("Ping"), "") .. ",padding=0.25;" .. "color,span=3;" .. "text,align=right;" .. -- clients "text,align=center,padding=0.25;" .. -- "/" diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index 4a2484613..de8890b11 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -577,6 +577,13 @@ int ModApiMainMenu::l_get_favorites(lua_State *L) lua_settable(L, top_lvl2); } + if (servers[i].isMember("ping")) { + float ping = servers[i]["ping"].asFloat(); + lua_pushstring(L, "ping"); + lua_pushnumber(L, ping); + lua_settable(L, top_lvl2); + } + lua_settable(L, top); index++; } diff --git a/textures/base/pack/server_ping_1.png b/textures/base/pack/server_ping_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5bba1e3da6f6ae3340b499b291ee4f2108b553 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3BisC9v-11Q2-;1OBO zz`!jG!i)^F=12eq*-JcqUD+QpF$oxo&scjS6DZW->Eak-aXNX+h7Ab|SPTpUINBC4 zo;r2v|J12d{~!LLBNFj%zJ~aM+Z}un9$P0SNC<42C?YP9%5k~#vHt)07XLok?^NV0 zKgjw2^?ykT35hA|H72JpC?BqO9ydI9W7y@PKf}~(?`fc$7(8A5T-G@yGywn{!BX1* literal 0 HcmV?d00001 diff --git a/textures/base/pack/server_ping_2.png b/textures/base/pack/server_ping_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8dca0be0d0a62de2046535079a018fb611b21388 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({hRn3dtu2NdBf@Q5sC zVBi)8VMc~ob0mO*>?NMQuIvw)m;?+Nb1HK!fI^L)E{-7 zsZ*!^Pn|mT|KT4xA`$=QYlttn-N6^(v2|jC#2kx%pZ<3~*8eY@t>q^^=fnPg^BWr* z9e;Ki{fkhz>NZEO;pT}03ND)%domhZ4#n?!BB9L8%-r0%)FRBT8%SPZeV-s?@#Ff! h8eb8+#|_Wj7^06Fy0*SB+5mJ6gQu&X%Q~loCIIN+Rm=bY literal 0 HcmV?d00001 diff --git a/textures/base/pack/server_ping_3.png b/textures/base/pack/server_ping_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cab017e10b3b6babfafe953cf663b7066cfa46 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3BisC9v-11Q2-;1OBO zz`!jG!i)^F=12eq*-JcqUD+QpF$ox`FVDZ(0u*ZUba4!^IDK{UUe3b~JZ|$3`A#^- zoWXflB+e-A=srfKc?W&NCd`&u@}d8b=&@IJELHrRoii^6@k_mKV-C3*dNtdRw}4-A zO6Er+-F?^jrKi-DG1R{P$ak(IvDvHT`A5-zs_&#+I-{ANeAh{@tmtJ**je0=vh%l8 jO_uVEbjAs%_ZPCRZ85nRx&ML#&@~L6u6{1-oD!M<0YFnr literal 0 HcmV?d00001 diff --git a/textures/base/pack/server_ping_4.png b/textures/base/pack/server_ping_4.png new file mode 100644 index 0000000000000000000000000000000000000000..03b4b5b83cf3c9dabc49234a31ec827a21bc02c2 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEFdh=kcmmafO&R~Z75JE$pCP8H}kFA2s zxjVKBMq4GcBuOZAo=-{CJeQED$v0hL>UoO?I|Ug&H0fq8I(UC4&^887S3j3^P6 Date: Sat, 4 Feb 2017 04:04:03 +0000 Subject: [PATCH 113/586] MapgenBasic node resolver: Various fixes Add a fallback node for stair_desert_stone to avoid ignore placed in Minimal subgame desert dungeons. Don't allow river_water_source to fallback to water_source as river water needs to be non-renewable and have a short flow range. Make stair_sandstonebrick fall back to sandstonebrick instead of sandstone. Re-order some lines. Add a comment. --- src/mapgen.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index e42fc7467..00ae917a1 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -587,23 +587,23 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer //// Look up some commonly used content c_stone = ndef->getId("mapgen_stone"); - c_water_source = ndef->getId("mapgen_water_source"); c_desert_stone = ndef->getId("mapgen_desert_stone"); c_sandstone = ndef->getId("mapgen_sandstone"); + c_water_source = ndef->getId("mapgen_water_source"); c_river_water_source = ndef->getId("mapgen_river_water_source"); // Fall back to more basic content if not defined + // river_water_source cannot fallback to water_source because river water + // needs to be non-renewable and have a short flow range. if (c_desert_stone == CONTENT_IGNORE) c_desert_stone = c_stone; if (c_sandstone == CONTENT_IGNORE) c_sandstone = c_stone; - if (c_river_water_source == CONTENT_IGNORE) - c_river_water_source = c_water_source; //// Content used for dungeon generation c_cobble = ndef->getId("mapgen_cobble"); - c_stair_cobble = ndef->getId("mapgen_stair_cobble"); c_mossycobble = ndef->getId("mapgen_mossycobble"); + c_stair_cobble = ndef->getId("mapgen_stair_cobble"); c_stair_desert_stone = ndef->getId("mapgen_stair_desert_stone"); c_sandstonebrick = ndef->getId("mapgen_sandstonebrick"); c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick"); @@ -613,10 +613,12 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emer c_mossycobble = c_cobble; if (c_stair_cobble == CONTENT_IGNORE) c_stair_cobble = c_cobble; + if (c_stair_desert_stone == CONTENT_IGNORE) + c_stair_desert_stone = c_desert_stone; if (c_sandstonebrick == CONTENT_IGNORE) c_sandstonebrick = c_sandstone; if (c_stair_sandstonebrick == CONTENT_IGNORE) - c_stair_sandstonebrick = c_sandstone; + c_stair_sandstonebrick = c_sandstonebrick; } From 8e4c11406e20a29ad659b99c840b5281941ae585 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 4 Feb 2017 04:28:02 +0000 Subject: [PATCH 114/586] Mgv6: Add stairs to desert stone dungeons As with the other mapgens, now that wide stairs in dungeons are possible we can now finally add stairs to desert stone dungeons. Re-order some lines. --- src/mapgen_v6.cpp | 26 +++++++++++++++----------- src/mapgen_v6.h | 1 + 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 79617a830..d4e3fa8d7 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -99,18 +99,10 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) c_snowblock = ndef->getId("mapgen_snowblock"); c_ice = ndef->getId("mapgen_ice"); - c_cobble = ndef->getId("mapgen_cobble"); - c_stair_cobble = ndef->getId("mapgen_stair_cobble"); - c_mossycobble = ndef->getId("mapgen_mossycobble"); - - if (c_desert_sand == CONTENT_IGNORE) - c_desert_sand = c_sand; if (c_desert_stone == CONTENT_IGNORE) c_desert_stone = c_stone; - if (c_mossycobble == CONTENT_IGNORE) - c_mossycobble = c_cobble; - if (c_stair_cobble == CONTENT_IGNORE) - c_stair_cobble = c_cobble; + if (c_desert_sand == CONTENT_IGNORE) + c_desert_sand = c_sand; if (c_dirt_with_snow == CONTENT_IGNORE) c_dirt_with_snow = c_dirt_with_grass; if (c_snow == CONTENT_IGNORE) @@ -119,6 +111,18 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) c_snowblock = c_dirt_with_grass; if (c_ice == CONTENT_IGNORE) c_ice = c_water_source; + + c_cobble = ndef->getId("mapgen_cobble"); + c_mossycobble = ndef->getId("mapgen_mossycobble"); + c_stair_cobble = ndef->getId("mapgen_stair_cobble"); + c_stair_desert_stone = ndef->getId("mapgen_stair_desert_stone"); + + if (c_mossycobble == CONTENT_IGNORE) + c_mossycobble = c_cobble; + if (c_stair_cobble == CONTENT_IGNORE) + c_stair_cobble = c_cobble; + if (c_stair_desert_stone == CONTENT_IGNORE) + c_stair_desert_stone = c_desert_stone; } @@ -571,7 +575,7 @@ void MapgenV6::makeChunk(BlockMakeData *data) if (getBiome(0, v2s16(node_min.X, node_min.Z)) == BT_DESERT) { dp.c_wall = c_desert_stone; dp.c_alt_wall = CONTENT_IGNORE; - dp.c_stair = c_desert_stone; + dp.c_stair = c_stair_desert_stone; dp.diagonal_dirs = true; dp.holesize = v3s16(2, 3, 2); diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index f018ffaca..44591e3dc 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -123,6 +123,7 @@ public: content_t c_cobble; content_t c_mossycobble; content_t c_stair_cobble; + content_t c_stair_desert_stone; MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge); ~MapgenV6(); From 047168ca839677bd967d6186e22f5476e2264709 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 4 Feb 2017 06:03:04 +0000 Subject: [PATCH 115/586] Mgv6: Add fallback node for gravel Gravel now falls back to stone. Gravel is not a particularly fundamental node, allowing it to fall back to stone frees up subgames from having to include a gravel node. Non-blob-ore gravel is only present in mgv6 as extremely rare 'gravel biomes'. --- src/mapgen_v6.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index d4e3fa8d7..807bbe751 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -99,6 +99,8 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) c_snowblock = ndef->getId("mapgen_snowblock"); c_ice = ndef->getId("mapgen_ice"); + if (c_gravel == CONTENT_IGNORE) + c_gravel = c_stone; if (c_desert_stone == CONTENT_IGNORE) c_desert_stone = c_stone; if (c_desert_sand == CONTENT_IGNORE) From de664b1c6d4b2bca47f918a6a865a920434bf664 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 4 Feb 2017 13:31:21 +0100 Subject: [PATCH 116/586] Fix PlayerSAO deletion warning (0eede97af2927dcda3545192403b0a44f30bcd1f) --- src/serverenvironment.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 7a5cfafd6..8d86a4e0a 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -2087,9 +2087,7 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) if(block) { - // Force delete object if mapblock is full, but ignore players - if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER && - block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { + if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) { warningstream << "ServerEnv: Trying to store id = " << obj->getId() << " statically but block " << PP(blockpos) << " already contains " @@ -2149,6 +2147,13 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) continue; } + if (!force_delete && obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + warningstream << "ServerEnvironment::deactivateFarObjects(): " + << "Trying to delete player object, THIS SHOULD NEVER HAPPEN!" + << std::endl; + continue; + } + verbosestream<<"ServerEnvironment::deactivateFarObjects(): " <<"object id="< Date: Tue, 31 Jan 2017 14:45:28 +0000 Subject: [PATCH 117/586] Derive NodeMetadata from Metadata --- build/android/jni/Android.mk | 2 +- src/CMakeLists.txt | 2 +- src/metadata.cpp | 69 ++++++++++++++++++++++++++++++++++++ src/metadata.h | 59 ++++++++++++++++++++++++++++++ src/nodemetadata.cpp | 40 ++------------------- src/nodemetadata.h | 19 ++-------- 6 files changed, 135 insertions(+), 56 deletions(-) create mode 100644 src/metadata.cpp create mode 100644 src/metadata.h diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 3be856770..8f333c3d4 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -184,6 +184,7 @@ LOCAL_SRC_FILES := \ jni/src/mapnode.cpp \ jni/src/mapsector.cpp \ jni/src/mesh.cpp \ + jni/src/metadata.cpp \ jni/src/mg_biome.cpp \ jni/src/mg_decoration.cpp \ jni/src/mg_ore.cpp \ @@ -384,4 +385,3 @@ ifdef GPROF $(call import-module,android-ndk-profiler) endif $(call import-module,android/native_app_glue) - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cab5a1139..afb591a04 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -430,6 +430,7 @@ set(common_SRCS mapgen_valleys.cpp mapnode.cpp mapsector.cpp + metadata.cpp mg_biome.cpp mg_decoration.cpp mg_ore.cpp @@ -893,4 +894,3 @@ endif() if (BUILD_CLIENT AND USE_FREETYPE) add_subdirectory(cguittfont) endif() - diff --git a/src/metadata.cpp b/src/metadata.cpp new file mode 100644 index 000000000..8e04aa2d3 --- /dev/null +++ b/src/metadata.cpp @@ -0,0 +1,69 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +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 "metadata.h" +#include "exceptions.h" +#include "gamedef.h" +#include "log.h" +#include + +/* + Metadata +*/ + +void Metadata::clear() +{ + m_stringvars.clear(); +} + +bool Metadata::empty() const +{ + return m_stringvars.size() == 0; +} + +std::string Metadata::getString(const std::string &name, + u16 recursion) const +{ + StringMap::const_iterator it = m_stringvars.find(name); + if (it == m_stringvars.end()) + return ""; + + return resolveString(it->second, recursion); +} + +void Metadata::setString(const std::string &name, const std::string &var) +{ + if (var.empty()) { + m_stringvars.erase(name); + } else { + m_stringvars[name] = var; + } +} + +std::string Metadata::resolveString(const std::string &str, + u16 recursion) const +{ + if (recursion > 1) { + return str; + } + if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { + return getString(str.substr(2, str.length() - 3), recursion + 1); + } + return str; +} diff --git a/src/metadata.h b/src/metadata.h new file mode 100644 index 000000000..a96bfc408 --- /dev/null +++ b/src/metadata.h @@ -0,0 +1,59 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +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 METADATA_HEADER +#define METADATA_HEADER + +#include "irr_v3d.h" +#include +#include +#include "util/string.h" + +/* + NodeMetadata stores arbitary amounts of data for special blocks. + Used for furnaces, chests and signs. + + There are two interaction methods: inventory menu and text input. + Only one can be used for a single metadata, thus only inventory OR + text input should exist in a metadata. +*/ + +class Inventory; +class IItemDefManager; + +class Metadata +{ +public: + void clear(); + bool empty() const; + + // Generic key/value store + std::string getString(const std::string &name, u16 recursion = 0) const; + void setString(const std::string &name, const std::string &var); + // Support variable names in values + std::string resolveString(const std::string &str, u16 recursion = 0) const; + const StringMap &getStrings() const + { + return m_stringvars; + } +private: + StringMap m_stringvars; +}; + +#endif diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 0801a028b..9b60cf33e 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -31,10 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc., */ NodeMetadata::NodeMetadata(IItemDefManager *item_def_mgr): - m_stringvars(), m_inventory(new Inventory(item_def_mgr)) -{ -} +{} NodeMetadata::~NodeMetadata() { @@ -70,13 +68,13 @@ void NodeMetadata::deSerialize(std::istream &is) void NodeMetadata::clear() { - m_stringvars.clear(); + Metadata::clear(); m_inventory->clear(); } bool NodeMetadata::empty() const { - return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0; + return Metadata::empty() && m_inventory->getLists().size() == 0; } /* @@ -216,35 +214,3 @@ int NodeMetadataList::countNonEmpty() const } return n; } - -std::string NodeMetadata::getString(const std::string &name, - unsigned short recursion) const -{ - StringMap::const_iterator it = m_stringvars.find(name); - if (it == m_stringvars.end()) - return ""; - - return resolveString(it->second, recursion); -} - -void NodeMetadata::setString(const std::string &name, const std::string &var) -{ - if (var.empty()) { - m_stringvars.erase(name); - } else { - m_stringvars[name] = var; - } -} - -std::string NodeMetadata::resolveString(const std::string &str, - unsigned short recursion) const -{ - if (recursion > 1) { - return str; - } - if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { - return getString(str.substr(2, str.length() - 3), recursion + 1); - } - return str; -} - diff --git a/src/nodemetadata.h b/src/nodemetadata.h index da1bf595d..f46c0fe91 100644 --- a/src/nodemetadata.h +++ b/src/nodemetadata.h @@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef NODEMETADATA_HEADER #define NODEMETADATA_HEADER -#include "irr_v3d.h" -#include -#include -#include "util/string.h" +#include "metadata.h" /* NodeMetadata stores arbitary amounts of data for special blocks. @@ -37,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Inventory; class IItemDefManager; -class NodeMetadata +class NodeMetadata : public Metadata { public: NodeMetadata(IItemDefManager *item_def_mgr); @@ -49,16 +46,6 @@ public: void clear(); bool empty() const; - // Generic key/value store - std::string getString(const std::string &name, unsigned short recursion = 0) const; - void setString(const std::string &name, const std::string &var); - // Support variable names in values - std::string resolveString(const std::string &str, unsigned short recursion = 0) const; - StringMap getStrings() const - { - return m_stringvars; - } - // The inventory Inventory *getInventory() { @@ -66,7 +53,6 @@ public: } private: - StringMap m_stringvars; Inventory *m_inventory; }; @@ -101,4 +87,3 @@ private: }; #endif - From 13f94ecad5d4fcda08663ee91e45b4a205a1dadb Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 31 Jan 2017 16:18:45 +0000 Subject: [PATCH 118/586] Make NodeMetaRef::getmeta a non-static member --- src/script/lua_api/l_nodemeta.cpp | 28 ++++++++++++++-------------- src/script/lua_api/l_nodemeta.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 631aa68ce..8391de03c 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -36,12 +36,12 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg) return *(NodeMetaRef**)ud; // unbox pointer } -NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, bool auto_create) +NodeMetadata* NodeMetaRef::getmeta(bool auto_create) { - NodeMetadata *meta = ref->m_env->getMap().getNodeMetadata(ref->m_p); - if(meta == NULL && auto_create) { - meta = new NodeMetadata(ref->m_env->getGameDef()->idef()); - if(!ref->m_env->getMap().setNodeMetadata(ref->m_p, meta)) { + NodeMetadata *meta = m_env->getMap().getNodeMetadata(m_p); + if (meta == NULL && auto_create) { + meta = new NodeMetadata(m_env->getGameDef()->idef()); + if (!m_env->getMap().setNodeMetadata(m_p, meta)) { delete meta; return NULL; } @@ -83,7 +83,7 @@ int NodeMetaRef::l_get_string(lua_State *L) NodeMetaRef *ref = checkobject(L, 1); std::string name = luaL_checkstring(L, 2); - NodeMetadata *meta = getmeta(ref, false); + NodeMetadata *meta = ref->getmeta(false); if(meta == NULL){ lua_pushlstring(L, "", 0); return 1; @@ -104,7 +104,7 @@ int NodeMetaRef::l_set_string(lua_State *L) const char *s = lua_tolstring(L, 3, &len); std::string str(s, len); - NodeMetadata *meta = getmeta(ref, !str.empty()); + NodeMetadata *meta = ref->getmeta(!str.empty()); if(meta == NULL || str == meta->getString(name)) return 0; meta->setString(name, str); @@ -120,7 +120,7 @@ int NodeMetaRef::l_get_int(lua_State *L) NodeMetaRef *ref = checkobject(L, 1); std::string name = lua_tostring(L, 2); - NodeMetadata *meta = getmeta(ref, false); + NodeMetadata *meta = ref->getmeta(false); if(meta == NULL){ lua_pushnumber(L, 0); return 1; @@ -140,7 +140,7 @@ int NodeMetaRef::l_set_int(lua_State *L) int a = lua_tointeger(L, 3); std::string str = itos(a); - NodeMetadata *meta = getmeta(ref, true); + NodeMetadata *meta = ref->getmeta(true); if(meta == NULL || str == meta->getString(name)) return 0; meta->setString(name, str); @@ -156,7 +156,7 @@ int NodeMetaRef::l_get_float(lua_State *L) NodeMetaRef *ref = checkobject(L, 1); std::string name = lua_tostring(L, 2); - NodeMetadata *meta = getmeta(ref, false); + NodeMetadata *meta = ref->getmeta(false); if(meta == NULL){ lua_pushnumber(L, 0); return 1; @@ -176,7 +176,7 @@ int NodeMetaRef::l_set_float(lua_State *L) float a = lua_tonumber(L, 3); std::string str = ftos(a); - NodeMetadata *meta = getmeta(ref, true); + NodeMetadata *meta = ref->getmeta(true); if(meta == NULL || str == meta->getString(name)) return 0; meta->setString(name, str); @@ -190,7 +190,7 @@ int NodeMetaRef::l_get_inventory(lua_State *L) MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); - getmeta(ref, true); // try to ensure the metadata exists + ref->getmeta(true); // try to ensure the metadata exists InvRef::createNodeMeta(L, ref->m_p); return 1; } @@ -202,7 +202,7 @@ int NodeMetaRef::l_to_table(lua_State *L) NodeMetaRef *ref = checkobject(L, 1); - NodeMetadata *meta = getmeta(ref, true); + NodeMetadata *meta = ref->getmeta(true); if (meta == NULL) { lua_pushnil(L); return 1; @@ -257,7 +257,7 @@ int NodeMetaRef::l_from_table(lua_State *L) } // Create new metadata - NodeMetadata *meta = getmeta(ref, true); + NodeMetadata *meta = ref->getmeta(true); if (meta == NULL) { lua_pushboolean(L, false); return 1; diff --git a/src/script/lua_api/l_nodemeta.h b/src/script/lua_api/l_nodemeta.h index e39ac3931..4ce338b18 100644 --- a/src/script/lua_api/l_nodemeta.h +++ b/src/script/lua_api/l_nodemeta.h @@ -52,7 +52,7 @@ private: * @param auto_create when true, try to create metadata information for the node if it has none. * @return pointer to a @c NodeMetadata object or @c NULL in case of error. */ - static NodeMetadata* getmeta(NodeMetaRef *ref, bool auto_create); + virtual NodeMetadata* getmeta(bool auto_create); static void reportMetadataChange(NodeMetaRef *ref); From c2e7b1f57941cb34cb7e3d71dc040fad53a64e3e Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 31 Jan 2017 16:43:45 +0000 Subject: [PATCH 119/586] Derive NodeMetaRef from MetaDataRef --- .gitignore | 2 +- build/android/jni/Android.mk | 1 + src/metadata.cpp | 48 ++++-- src/metadata.h | 4 +- src/script/lua_api/CMakeLists.txt | 2 +- src/script/lua_api/l_metadata.cpp | 252 ++++++++++++++++++++++++++++++ src/script/lua_api/l_metadata.h | 71 +++++++++ src/script/lua_api/l_nodemeta.cpp | 224 ++++---------------------- src/script/lua_api/l_nodemeta.h | 35 +---- 9 files changed, 407 insertions(+), 232 deletions(-) create mode 100644 src/script/lua_api/l_metadata.cpp create mode 100644 src/script/lua_api/l_metadata.h diff --git a/.gitignore b/.gitignore index d7e0daab4..c2600afeb 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,7 @@ locale/ *.a *.ninja .ninja* +*.gch ## Android build files build/android/src/main/assets @@ -86,4 +87,3 @@ build/android/obj build/android/local.properties build/android/.gradle timestamp - diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 8f333c3d4..70a3d29c0 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -307,6 +307,7 @@ LOCAL_SRC_FILES += \ jni/src/script/lua_api/l_item.cpp \ jni/src/script/lua_api/l_mainmenu.cpp \ jni/src/script/lua_api/l_mapgen.cpp \ + jni/src/script/lua_api/l_metadata.cpp \ jni/src/script/lua_api/l_nodemeta.cpp \ jni/src/script/lua_api/l_nodetimer.cpp \ jni/src/script/lua_api/l_noise.cpp \ diff --git a/src/metadata.cpp b/src/metadata.cpp index 8e04aa2d3..96453d710 100644 --- a/src/metadata.cpp +++ b/src/metadata.cpp @@ -37,12 +37,39 @@ bool Metadata::empty() const return m_stringvars.size() == 0; } -std::string Metadata::getString(const std::string &name, - u16 recursion) const +size_t Metadata::size() const +{ + return m_stringvars.size(); +} + +bool Metadata::contains(const std::string &name) const +{ + return m_stringvars.find(name) != m_stringvars.end(); +} + +bool Metadata::operator==(const Metadata &other) const +{ + if (size() != other.size()) + return false; + + for (StringMap::const_iterator it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + if (!other.contains(it->first) || + other.getString(it->first) != it->second) + return false; + } + + return true; +} + +const std::string &Metadata::getString(const std::string &name, + u16 recursion) const { StringMap::const_iterator it = m_stringvars.find(name); - if (it == m_stringvars.end()) - return ""; + if (it == m_stringvars.end()) { + static const std::string empty_string = std::string(""); + return empty_string; + } return resolveString(it->second, recursion); } @@ -56,14 +83,13 @@ void Metadata::setString(const std::string &name, const std::string &var) } } -std::string Metadata::resolveString(const std::string &str, - u16 recursion) const +const std::string &Metadata::resolveString(const std::string &str, + u16 recursion) const { - if (recursion > 1) { + if (recursion <= 1 && + str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { + return getString(str.substr(2, str.length() - 3), recursion + 1); + } else { return str; } - if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { - return getString(str.substr(2, str.length() - 3), recursion + 1); - } - return str; } diff --git a/src/metadata.h b/src/metadata.h index a96bfc408..a629c0615 100644 --- a/src/metadata.h +++ b/src/metadata.h @@ -44,10 +44,10 @@ public: bool empty() const; // Generic key/value store - std::string getString(const std::string &name, u16 recursion = 0) const; + const std::string &getString(const std::string &name, u16 recursion = 0) const; void setString(const std::string &name, const std::string &var); // Support variable names in values - std::string resolveString(const std::string &str, u16 recursion = 0) const; + const std::string &resolveString(const std::string &str, u16 recursion = 0) const; const StringMap &getStrings() const { return m_stringvars; diff --git a/src/script/lua_api/CMakeLists.txt b/src/script/lua_api/CMakeLists.txt index d507dcf70..efccce515 100644 --- a/src/script/lua_api/CMakeLists.txt +++ b/src/script/lua_api/CMakeLists.txt @@ -6,6 +6,7 @@ set(common_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_inventory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_item.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_mapgen.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_metadata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_nodemeta.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_nodetimer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_noise.cpp @@ -22,4 +23,3 @@ set(common_SCRIPT_LUA_API_SRCS set(client_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_mainmenu.cpp PARENT_SCOPE) - diff --git a/src/script/lua_api/l_metadata.cpp b/src/script/lua_api/l_metadata.cpp new file mode 100644 index 000000000..b54005bac --- /dev/null +++ b/src/script/lua_api/l_metadata.cpp @@ -0,0 +1,252 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +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 "lua_api/l_metadata.h" +#include "lua_api/l_internal.h" +#include "common/c_content.h" +#include "serverenvironment.h" +#include "map.h" +#include "server.h" + +// LUALIB_API +void *luaL_checkudata_is_metadataref(lua_State *L, int ud) { + void *p = lua_touserdata(L, ud); + if (p != NULL && // value is a userdata? + lua_getmetatable(L, ud)) { // does it have a metatable? + lua_getfield(L, -1, "metadata_class"); + if (lua_type(L, -1) == LUA_TSTRING) { // does it have a metadata_class field? + return p; + } + } + luaL_typerror(L, ud, "MetaDataRef"); + return NULL; +} + +MetaDataRef* MetaDataRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata_is_metadataref(L, narg); + if (!ud) + luaL_typerror(L, narg, "MetaDataRef"); + + return *(MetaDataRef**)ud; // unbox pointer +} + +// Exported functions + +// get_string(self, name) +int MetaDataRef::l_get_string(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = luaL_checkstring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushlstring(L, "", 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushlstring(L, str.c_str(), str.size()); + return 1; +} + +// set_string(self, name, var) +int MetaDataRef::l_set_string(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = luaL_checkstring(L, 2); + size_t len = 0; + const char *s = lua_tolstring(L, 3, &len); + std::string str(s, len); + + Metadata *meta = ref->getmeta(!str.empty()); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// get_int(self, name) +int MetaDataRef::l_get_int(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushnumber(L, 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushnumber(L, stoi(str)); + return 1; +} + +// set_int(self, name, var) +int MetaDataRef::l_set_int(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + int a = lua_tointeger(L, 3); + std::string str = itos(a); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// get_float(self, name) +int MetaDataRef::l_get_float(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + + Metadata *meta = ref->getmeta(false); + if (meta == NULL) { + lua_pushnumber(L, 0); + return 1; + } + + const std::string &str = meta->getString(name); + lua_pushnumber(L, stof(str)); + return 1; +} + +// set_float(self, name, var) +int MetaDataRef::l_set_float(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + std::string name = lua_tostring(L, 2); + float a = lua_tonumber(L, 3); + std::string str = ftos(a); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL || str == meta->getString(name)) + return 0; + + meta->setString(name, str); + ref->reportMetadataChange(); + return 0; +} + +// to_table(self) +int MetaDataRef::l_to_table(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + + Metadata *meta = ref->getmeta(true); + if (meta == NULL) { + lua_pushnil(L); + return 1; + } + lua_newtable(L); + + ref->handleToTable(L, meta); + + return 1; +} + +// from_table(self, table) +int MetaDataRef::l_from_table(lua_State *L) +{ + MAP_LOCK_REQUIRED; + + MetaDataRef *ref = checkobject(L, 1); + int base = 2; + + ref->clearMeta(); + + if (!lua_istable(L, base)) { + // No metadata + lua_pushboolean(L, true); + return 1; + } + + // Create new metadata + Metadata *meta = ref->getmeta(true); + if (meta == NULL) { + lua_pushboolean(L, false); + return 1; + } + + bool was_successful = ref->handleFromTable(L, base, meta); + ref->reportMetadataChange(); + lua_pushboolean(L, was_successful); + return 1; +} + +void MetaDataRef::handleToTable(lua_State *L, Metadata *meta) +{ + lua_newtable(L); + { + const StringMap &fields = meta->getStrings(); + for (StringMap::const_iterator + it = fields.begin(); it != fields.end(); ++it) { + const std::string &name = it->first; + const std::string &value = it->second; + lua_pushlstring(L, name.c_str(), name.size()); + lua_pushlstring(L, value.c_str(), value.size()); + lua_settable(L, -3); + } + } + lua_setfield(L, -2, "fields"); +} + +bool MetaDataRef::handleFromTable(lua_State *L, int table, Metadata *meta) +{ + // Set fields + lua_getfield(L, table, "fields"); + if (lua_istable(L, -1)) { + int fieldstable = lua_gettop(L); + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string name = lua_tostring(L, -2); + size_t cl; + const char *cs = lua_tolstring(L, -1, &cl); + meta->setString(name, std::string(cs, cl)); + lua_pop(L, 1); // Remove value, keep key for next iteration + } + lua_pop(L, 1); + } + + return true; +} diff --git a/src/script/lua_api/l_metadata.h b/src/script/lua_api/l_metadata.h new file mode 100644 index 000000000..561be6adf --- /dev/null +++ b/src/script/lua_api/l_metadata.h @@ -0,0 +1,71 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +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 L_METADATA_H_ +#define L_METADATA_H_ + +#include "lua_api/l_base.h" +#include "irrlichttypes_bloated.h" + +class Metadata; + +/* + NodeMetaRef +*/ + +class MetaDataRef : public ModApiBase { +public: + virtual ~MetaDataRef() {} +protected: + static MetaDataRef *checkobject(lua_State *L, int narg); + + virtual void reportMetadataChange() {} + virtual Metadata* getmeta(bool auto_create) = 0; + virtual void clearMeta() = 0; + + virtual void handleToTable(lua_State *L, Metadata *meta); + virtual bool handleFromTable(lua_State *L, int table, Metadata *meta); + + // Exported functions + + // get_string(self, name) + static int l_get_string(lua_State *L); + + // set_string(self, name, var) + static int l_set_string(lua_State *L); + + // get_int(self, name) + static int l_get_int(lua_State *L); + + // set_int(self, name, var) + static int l_set_int(lua_State *L); + + // get_float(self, name) + static int l_get_float(lua_State *L); + + // set_float(self, name, var) + static int l_set_float(lua_State *L); + + // to_table(self) + static int l_to_table(lua_State *L); + + // from_table(self, table) + static int l_from_table(lua_State *L); +}; + +#endif /* L_NODEMETA_H_ */ diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 8391de03c..4b2b392da 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -36,7 +36,7 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg) return *(NodeMetaRef**)ud; // unbox pointer } -NodeMetadata* NodeMetaRef::getmeta(bool auto_create) +Metadata* NodeMetaRef::getmeta(bool auto_create) { NodeMetadata *meta = m_env->getMap().getNodeMetadata(m_p); if (meta == NULL && auto_create) { @@ -49,17 +49,22 @@ NodeMetadata* NodeMetaRef::getmeta(bool auto_create) return meta; } -void NodeMetaRef::reportMetadataChange(NodeMetaRef *ref) +void NodeMetaRef::clearMeta() +{ + m_env->getMap().removeNodeMetadata(m_p); +} + +void NodeMetaRef::reportMetadataChange() { // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed - v3s16 blockpos = getNodeBlockPos(ref->m_p); + v3s16 blockpos = getNodeBlockPos(m_p); MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.p = blockpos; - ref->m_env->getMap().dispatchEvent(&event); + m_env->getMap().dispatchEvent(&event); // Set the block to be saved - MapBlock *block = ref->m_env->getMap().getBlockNoCreateNoEx(blockpos); + MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos); if (block) { block->raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_REPORT_META_CHANGE); @@ -75,115 +80,6 @@ int NodeMetaRef::gc_object(lua_State *L) { return 0; } -// get_string(self, name) -int NodeMetaRef::l_get_string(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = luaL_checkstring(L, 2); - - NodeMetadata *meta = ref->getmeta(false); - if(meta == NULL){ - lua_pushlstring(L, "", 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushlstring(L, str.c_str(), str.size()); - return 1; -} - -// set_string(self, name, var) -int NodeMetaRef::l_set_string(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = luaL_checkstring(L, 2); - size_t len = 0; - const char *s = lua_tolstring(L, 3, &len); - std::string str(s, len); - - NodeMetadata *meta = ref->getmeta(!str.empty()); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - -// get_int(self, name) -int NodeMetaRef::l_get_int(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - - NodeMetadata *meta = ref->getmeta(false); - if(meta == NULL){ - lua_pushnumber(L, 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushnumber(L, stoi(str)); - return 1; -} - -// set_int(self, name, var) -int NodeMetaRef::l_set_int(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - int a = lua_tointeger(L, 3); - std::string str = itos(a); - - NodeMetadata *meta = ref->getmeta(true); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - -// get_float(self, name) -int NodeMetaRef::l_get_float(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - - NodeMetadata *meta = ref->getmeta(false); - if(meta == NULL){ - lua_pushnumber(L, 0); - return 1; - } - std::string str = meta->getString(name); - lua_pushnumber(L, stof(str)); - return 1; -} - -// set_float(self, name, var) -int NodeMetaRef::l_set_float(lua_State *L) -{ - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - std::string name = lua_tostring(L, 2); - float a = lua_tonumber(L, 3); - std::string str = ftos(a); - - NodeMetadata *meta = ref->getmeta(true); - if(meta == NULL || str == meta->getString(name)) - return 0; - meta->setString(name, str); - reportMetadataChange(ref); - return 0; -} - // get_inventory(self) int NodeMetaRef::l_get_inventory(lua_State *L) { @@ -195,34 +91,12 @@ int NodeMetaRef::l_get_inventory(lua_State *L) return 1; } -// to_table(self) -int NodeMetaRef::l_to_table(lua_State *L) +void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta) { - MAP_LOCK_REQUIRED; - - NodeMetaRef *ref = checkobject(L, 1); - - NodeMetadata *meta = ref->getmeta(true); - if (meta == NULL) { - lua_pushnil(L); - return 1; - } - lua_newtable(L); - // fields - lua_newtable(L); - { - StringMap fields = meta->getStrings(); - for (StringMap::const_iterator - it = fields.begin(); it != fields.end(); ++it) { - const std::string &name = it->first; - const std::string &value = it->second; - lua_pushlstring(L, name.c_str(), name.size()); - lua_pushlstring(L, value.c_str(), value.size()); - lua_settable(L, -3); - } - } - lua_setfield(L, -2, "fields"); + MetaDataRef::handleToTable(L, _meta); + + NodeMetadata *meta = (NodeMetadata*) _meta; // inventory lua_newtable(L); @@ -236,52 +110,20 @@ int NodeMetaRef::l_to_table(lua_State *L) } } lua_setfield(L, -2, "inventory"); - return 1; } // from_table(self, table) -int NodeMetaRef::l_from_table(lua_State *L) +bool NodeMetaRef::handleFromTable(lua_State *L, int table, Metadata *_meta) { - MAP_LOCK_REQUIRED; + // fields + if (!MetaDataRef::handleFromTable(L, table, _meta)) + return false; - NodeMetaRef *ref = checkobject(L, 1); - int base = 2; + NodeMetadata *meta = (NodeMetadata*) _meta; - // clear old metadata first - ref->m_env->getMap().removeNodeMetadata(ref->m_p); - - if (!lua_istable(L, base)) { - // No metadata - lua_pushboolean(L, true); - return 1; - } - - // Create new metadata - NodeMetadata *meta = ref->getmeta(true); - if (meta == NULL) { - lua_pushboolean(L, false); - return 1; - } - - // Set fields - lua_getfield(L, base, "fields"); - if (lua_istable(L, -1)) { - int fieldstable = lua_gettop(L); - lua_pushnil(L); - while (lua_next(L, fieldstable) != 0) { - // key at index -2 and value at index -1 - std::string name = lua_tostring(L, -2); - size_t cl; - const char *cs = lua_tolstring(L, -1, &cl); - meta->setString(name, std::string(cs, cl)); - lua_pop(L, 1); // Remove value, keep key for next iteration - } - lua_pop(L, 1); - } - - // Set inventory + // inventory Inventory *inv = meta->getInventory(); - lua_getfield(L, base, "inventory"); + lua_getfield(L, table, "inventory"); if (lua_istable(L, -1)) { int inventorytable = lua_gettop(L); lua_pushnil(L); @@ -294,9 +136,7 @@ int NodeMetaRef::l_from_table(lua_State *L) lua_pop(L, 1); } - reportMetadataChange(ref); - lua_pushboolean(L, true); - return 1; + return true; } @@ -332,6 +172,10 @@ void NodeMetaRef::Register(lua_State *L) lua_pushvalue(L, methodtable); lua_settable(L, metatable); // hide metatable from Lua getmetatable() + lua_pushliteral(L, "metadata_class"); + lua_pushlstring(L, className, strlen(className)); + lua_settable(L, metatable); + lua_pushliteral(L, "__index"); lua_pushvalue(L, methodtable); lua_settable(L, metatable); @@ -351,14 +195,14 @@ void NodeMetaRef::Register(lua_State *L) const char NodeMetaRef::className[] = "NodeMetaRef"; const luaL_reg NodeMetaRef::methods[] = { - luamethod(NodeMetaRef, get_string), - luamethod(NodeMetaRef, set_string), - luamethod(NodeMetaRef, get_int), - luamethod(NodeMetaRef, set_int), - luamethod(NodeMetaRef, get_float), - luamethod(NodeMetaRef, set_float), + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, set_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, set_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, set_float), + luamethod(MetaDataRef, to_table), + luamethod(MetaDataRef, from_table), luamethod(NodeMetaRef, get_inventory), - luamethod(NodeMetaRef, to_table), - luamethod(NodeMetaRef, from_table), {0,0} }; diff --git a/src/script/lua_api/l_nodemeta.h b/src/script/lua_api/l_nodemeta.h index 4ce338b18..d03f086c9 100644 --- a/src/script/lua_api/l_nodemeta.h +++ b/src/script/lua_api/l_nodemeta.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define L_NODEMETA_H_ #include "lua_api/l_base.h" +#include "lua_api/l_metadata.h" #include "irrlichttypes_bloated.h" class ServerEnvironment; @@ -29,7 +30,7 @@ class NodeMetadata; NodeMetaRef */ -class NodeMetaRef : public ModApiBase { +class NodeMetaRef : public MetaDataRef { private: v3s16 m_p; ServerEnvironment *m_env; @@ -52,42 +53,22 @@ private: * @param auto_create when true, try to create metadata information for the node if it has none. * @return pointer to a @c NodeMetadata object or @c NULL in case of error. */ - virtual NodeMetadata* getmeta(bool auto_create); + virtual Metadata* getmeta(bool auto_create); + virtual void clearMeta(); - static void reportMetadataChange(NodeMetaRef *ref); + virtual void reportMetadataChange(); + + virtual void handleToTable(lua_State *L, Metadata *_meta); + virtual bool handleFromTable(lua_State *L, int table, Metadata *_meta); // Exported functions // garbage collector static int gc_object(lua_State *L); - // get_string(self, name) - static int l_get_string(lua_State *L); - - // set_string(self, name, var) - static int l_set_string(lua_State *L); - - // get_int(self, name) - static int l_get_int(lua_State *L); - - // set_int(self, name, var) - static int l_set_int(lua_State *L); - - // get_float(self, name) - static int l_get_float(lua_State *L); - - // set_float(self, name, var) - static int l_set_float(lua_State *L); - // get_inventory(self) static int l_get_inventory(lua_State *L); - // to_table(self) - static int l_to_table(lua_State *L); - - // from_table(self, table) - static int l_from_table(lua_State *L); - public: NodeMetaRef(v3s16 p, ServerEnvironment *env); From f2aa2c6a986dec47856c49ae5f54fbf3c688e027 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 31 Jan 2017 19:49:01 +0000 Subject: [PATCH 120/586] Add ItemStack key-value meta storage --- build/android/jni/Android.mk | 2 + doc/lua_api.txt | 45 ++++++++-- src/CMakeLists.txt | 1 + src/content_cao.cpp | 2 +- src/craftdef.cpp | 3 +- src/inventory.cpp | 88 +++---------------- src/inventory.h | 14 +-- src/itemstackmetadata.cpp | 43 +++++++++ src/itemstackmetadata.h | 35 ++++++++ src/metadata.cpp | 2 + src/metadata.h | 38 ++++---- src/script/common/c_content.cpp | 31 +++++-- src/script/lua_api/CMakeLists.txt | 1 + src/script/lua_api/l_env.cpp | 2 +- src/script/lua_api/l_item.cpp | 38 +++++++- src/script/lua_api/l_item.h | 5 ++ src/script/lua_api/l_itemstackmeta.cpp | 115 +++++++++++++++++++++++++ src/script/lua_api/l_itemstackmeta.h | 59 +++++++++++++ src/script/scripting_game.cpp | 2 + src/util/serialize.cpp | 49 +++++++++++ src/util/serialize.h | 7 ++ 21 files changed, 459 insertions(+), 123 deletions(-) create mode 100644 src/itemstackmetadata.cpp create mode 100644 src/itemstackmetadata.h create mode 100644 src/script/lua_api/l_itemstackmeta.cpp create mode 100644 src/script/lua_api/l_itemstackmeta.h diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 70a3d29c0..47f37cfa5 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -164,6 +164,7 @@ LOCAL_SRC_FILES := \ jni/src/inventory.cpp \ jni/src/inventorymanager.cpp \ jni/src/itemdef.cpp \ + jni/src/itemstackmetadata.cpp \ jni/src/keycode.cpp \ jni/src/light.cpp \ jni/src/localplayer.cpp \ @@ -305,6 +306,7 @@ LOCAL_SRC_FILES += \ jni/src/script/lua_api/l_env.cpp \ jni/src/script/lua_api/l_inventory.cpp \ jni/src/script/lua_api/l_item.cpp \ + jni/src/script/lua_api/l_itemstackmeta.cpp\ jni/src/script/lua_api/l_mainmenu.cpp \ jni/src/script/lua_api/l_mapgen.cpp \ jni/src/script/lua_api/l_metadata.cpp \ diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 219882f46..2f5e3706c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1411,7 +1411,7 @@ the entity itself. * `direction` is a unit vector, pointing from the source of the punch to the punched object. * `damage` damage that will be done to entity -Return value of this function will determin if damage is done by this function +Return value of this function will determin if damage is done by this function (retval true) or shall be done by engine (retval false) To punch an entity/object in Lua, call: @@ -1427,9 +1427,9 @@ Node Metadata ------------- The instance of a node in the world normally only contains the three values mentioned in "Nodes". However, it is possible to insert extra data into a -node. It is called "node metadata"; See "`NodeMetaRef`". +node. It is called "node metadata"; See `NodeMetaRef`. -Metadata contains two things: +Node metadata contains two things: * A key-value store * An inventory @@ -1467,6 +1467,18 @@ Example stuff: } }) +Item Metadata +------------- +Item stacks can store metadata too. See `ItemStackMetaRef`. + +Item metadata only contains a key-value store. + +Example stuff: + + local meta = stack:get_meta() + meta:set_string("key", "value") + print(dump(meta:to_table())) + Formspec -------- Formspec defines a menu. Currently not much else than inventories are @@ -2774,9 +2786,8 @@ These functions return the leftover itemstack. Class reference --------------- -### `NodeMetaRef` -Node metadata: reference extra data and functionality stored in a node. -Can be gotten via `minetest.get_meta(pos)`. +### `MetaDataRef` +See `NodeMetaRef` and `ItemStackMetaRef`. #### Methods * `set_string(name, value)` @@ -2785,13 +2796,29 @@ Can be gotten via `minetest.get_meta(pos)`. * `get_int(name)` * `set_float(name, value)` * `get_float(name)` -* `get_inventory()`: returns `InvRef` -* `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}` +* `to_table()`: returns `nil` or a table with keys: + * `fields`: key-value storage + * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only) * `from_table(nil or {})` * Any non-table value will clear the metadata - * See "Node Metadata" + * See "Node Metadata" for an example * returns `true` on success +### `NodeMetaRef` +Node metadata: reference extra data and functionality stored in a node. +Can be gotten via `minetest.get_meta(pos)`. + +#### Methods +* All methods in MetaDataRef +* `get_inventory()`: returns `InvRef` + +### `ItemStackMetaRef` +ItemStack metadata: reference extra data and functionality stored in a stack. +Can be gotten via `item:get_meta()`. + +#### Methods +* All methods in MetaDataRef + ### `NodeTimerRef` Node Timers: a high resolution persistent per-node timer. Can be gotten via `minetest.get_node_timer(pos)`. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afb591a04..30e6c85e4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -415,6 +415,7 @@ set(common_SRCS inventory.cpp inventorymanager.cpp itemdef.cpp + itemstackmetadata.cpp light.cpp log.cpp map.cpp diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 5dc3866cf..e0b1c4cd2 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -938,7 +938,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, if(m_prop.textures.size() >= 1){ infostream<<"textures[0]: "<idef(); - ItemStack item(m_prop.textures[0], 1, 0, "", idef); + ItemStack item(m_prop.textures[0], 1, 0, idef); m_wield_meshnode = new WieldMeshSceneNode( smgr->getRootSceneNode(), smgr, -1); diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 45d3018a7..286d1eada 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -139,7 +139,7 @@ static std::vector craftGetItems( for (std::vector::size_type i = 0; i < items.size(); i++) { result.push_back(ItemStack(std::string(items[i]), (u16)1, - (u16)0, "", gamedef->getItemDefManager())); + (u16)0, gamedef->getItemDefManager())); } return result; } @@ -1126,4 +1126,3 @@ IWritableCraftDefManager* createCraftDefManager() { return new CCraftDefManager(); } - diff --git a/src/inventory.cpp b/src/inventory.cpp index cb8faecbc..6d5b49916 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -45,82 +45,16 @@ static content_t content_translate_from_19_to_internal(content_t c_from) return c_from; } -// If the string contains spaces, quotes or control characters, encodes as JSON. -// Else returns the string unmodified. -static std::string serializeJsonStringIfNeeded(const std::string &s) -{ - for(size_t i = 0; i < s.size(); ++i) - { - if(s[i] <= 0x1f || s[i] >= 0x7f || s[i] == ' ' || s[i] == '\"') - return serializeJsonString(s); - } - return s; -} - -// Parses a string serialized by serializeJsonStringIfNeeded. -static std::string deSerializeJsonStringIfNeeded(std::istream &is) -{ - std::ostringstream tmp_os; - bool expect_initial_quote = true; - bool is_json = false; - bool was_backslash = false; - for(;;) - { - char c = is.get(); - if(is.eof()) - break; - if(expect_initial_quote && c == '"') - { - tmp_os << c; - is_json = true; - } - else if(is_json) - { - tmp_os << c; - if(was_backslash) - was_backslash = false; - else if(c == '\\') - was_backslash = true; - else if(c == '"') - break; // Found end of string - } - else - { - if(c == ' ') - { - // Found end of word - is.unget(); - break; - } - else - { - tmp_os << c; - } - } - expect_initial_quote = false; - } - if(is_json) - { - std::istringstream tmp_is(tmp_os.str(), std::ios::binary); - return deSerializeJsonString(tmp_is); - } - else - return tmp_os.str(); -} - - -ItemStack::ItemStack(std::string name_, u16 count_, - u16 wear_, std::string metadata_, - IItemDefManager *itemdef) +ItemStack::ItemStack(const std::string &name_, u16 count_, + u16 wear_, IItemDefManager *itemdef) { name = itemdef->getAlias(name_); count = count_; wear = wear_; - metadata = metadata_; - if(name.empty() || count == 0) + if (name.empty() || count == 0) clear(); - else if(itemdef->get(name).type == ITEM_TOOL) + else if (itemdef->get(name).type == ITEM_TOOL) count = 1; } @@ -137,7 +71,7 @@ void ItemStack::serialize(std::ostream &os) const parts = 2; if(wear != 0) parts = 3; - if(metadata != "") + if (!metadata.empty()) parts = 4; os<= 3) os<<" "<= 4) - os<<" "<= 4) { + os << " "; + metadata.serialize(os); + } } void ItemStack::deSerialize(std::istream &is, IItemDefManager *itemdef) @@ -289,7 +225,7 @@ void ItemStack::deSerialize(std::istream &is, IItemDefManager *itemdef) wear = stoi(wear_str); // Read metadata - metadata = deSerializeJsonStringIfNeeded(is); + metadata.deSerialize(is); // In case fields are added after metadata, skip space here: //std::getline(is, tmp, ' '); @@ -335,7 +271,7 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_, *this = newitem; newitem.clear(); } - // If item name or metadata differs, bail out + // If item name or metadata differs, bail out else if (name != newitem.name || metadata != newitem.metadata) { @@ -375,7 +311,7 @@ bool ItemStack::itemFits(const ItemStack &newitem_, { newitem.clear(); } - // If item name or metadata differs, bail out + // If item name or metadata differs, bail out else if (name != newitem.name || metadata != newitem.metadata) { diff --git a/src/inventory.h b/src/inventory.h index 7d7e58d61..fe1639728 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" #include "itemdef.h" #include "irrlichttypes.h" +#include "itemstackmetadata.h" #include #include #include @@ -32,10 +33,10 @@ struct ToolCapabilities; struct ItemStack { - ItemStack(): name(""), count(0), wear(0), metadata("") {} - ItemStack(std::string name_, u16 count_, - u16 wear, std::string metadata_, - IItemDefManager *itemdef); + ItemStack(): name(""), count(0), wear(0) {} + ItemStack(const std::string &name_, u16 count_, + u16 wear, IItemDefManager *itemdef); + ~ItemStack() {} // Serialization @@ -61,7 +62,7 @@ struct ItemStack name = ""; count = 0; wear = 0; - metadata = ""; + metadata.clear(); } void add(u16 n) @@ -166,7 +167,7 @@ struct ItemStack std::string name; u16 count; u16 wear; - std::string metadata; + ItemStackMetadata metadata; }; class InventoryList @@ -313,4 +314,3 @@ private: }; #endif - diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp new file mode 100644 index 000000000..c3d602245 --- /dev/null +++ b/src/itemstackmetadata.cpp @@ -0,0 +1,43 @@ +#include "itemstackmetadata.h" +#include "util/serialize.h" +#include "util/strfnd.h" + +#define DESERIALIZE_START '\x01' +#define DESERIALIZE_KV_DELIM '\x02' +#define DESERIALIZE_PAIR_DELIM '\x03' +#define DESERIALIZE_START_STR "\x01" +#define DESERIALIZE_KV_DELIM_STR "\x02" +#define DESERIALIZE_PAIR_DELIM_STR "\x03" + +void ItemStackMetadata::serialize(std::ostream &os) const +{ + std::ostringstream os2; + os2 << DESERIALIZE_START; + for (StringMap::const_iterator + it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + os2 << it->first << DESERIALIZE_KV_DELIM + << it->second << DESERIALIZE_PAIR_DELIM; + } + os << serializeJsonStringIfNeeded(os2.str()); +} + +void ItemStackMetadata::deSerialize(std::istream &is) +{ + std::string in = deSerializeJsonStringIfNeeded(is); + + m_stringvars.clear(); + + if (!in.empty() && in[0] == DESERIALIZE_START) { + Strfnd fnd(in); + fnd.to(1); + while (!fnd.at_end()) { + std::string name = fnd.next(DESERIALIZE_KV_DELIM_STR); + std::string var = fnd.next(DESERIALIZE_PAIR_DELIM_STR); + m_stringvars[name] = var; + } + } else { + // BACKWARDS COMPATIBILITY + m_stringvars[""] = in; + } +} diff --git a/src/itemstackmetadata.h b/src/itemstackmetadata.h new file mode 100644 index 000000000..c56c58fd2 --- /dev/null +++ b/src/itemstackmetadata.h @@ -0,0 +1,35 @@ +/* +Minetest +Copyright (C) 2010-2013 rubenwardy + +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 ITEMSTACKMETADATA_HEADER +#define ITEMSTACKMETADATA_HEADER + +#include "metadata.h" + +class Inventory; +class IItemDefManager; + +class ItemStackMetadata : public Metadata +{ +public: + void serialize(std::ostream &os) const; + void deSerialize(std::istream &is); +}; + +#endif diff --git a/src/metadata.cpp b/src/metadata.cpp index 96453d710..3cc45f919 100644 --- a/src/metadata.cpp +++ b/src/metadata.cpp @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "log.h" #include +#include "constants.h" // MAP_BLOCKSIZE +#include /* Metadata diff --git a/src/metadata.h b/src/metadata.h index a629c0615..4bb3c2ee7 100644 --- a/src/metadata.h +++ b/src/metadata.h @@ -25,35 +25,37 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "util/string.h" -/* - NodeMetadata stores arbitary amounts of data for special blocks. - Used for furnaces, chests and signs. - - There are two interaction methods: inventory menu and text input. - Only one can be used for a single metadata, thus only inventory OR - text input should exist in a metadata. -*/ - -class Inventory; -class IItemDefManager; - class Metadata { public: - void clear(); - bool empty() const; + virtual ~Metadata() {} - // Generic key/value store + virtual void clear(); + virtual bool empty() const; + + bool operator==(const Metadata &other) const; + inline bool operator!=(const Metadata &other) const + { + return !(*this == other); + } + + // + // Key-value related + // + + size_t size() const; + bool contains(const std::string &name) const; const std::string &getString(const std::string &name, u16 recursion = 0) const; void setString(const std::string &name, const std::string &var); - // Support variable names in values - const std::string &resolveString(const std::string &str, u16 recursion = 0) const; const StringMap &getStrings() const { return m_stringvars; } -private: + // Add support for variable names in values + const std::string &resolveString(const std::string &str, u16 recursion = 0) const; +protected: StringMap m_stringvars; + }; #endif diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index ebc951295..8925b51f4 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -824,11 +824,32 @@ ItemStack read_item(lua_State* L, int index,Server* srv) std::string name = getstringfield_default(L, index, "name", ""); int count = getintfield_default(L, index, "count", 1); int wear = getintfield_default(L, index, "wear", 0); - std::string metadata = getstringfield_default(L, index, "metadata", ""); - return ItemStack(name, count, wear, metadata, idef); - } - else - { + + ItemStack istack(name, count, wear, idef); + + lua_getfield(L, index, "metadata"); + + // Support old metadata format by checking type + int fieldstable = lua_gettop(L); + if (lua_istable(L, fieldstable)) { + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string key = lua_tostring(L, -2); + size_t value_len; + const char *value_cs = lua_tolstring(L, -1, &value_len); + std::string value(value_cs, value_len); + istack.metadata.setString(name, value); + lua_pop(L, 1); // removes value, keeps key for next iteration + } + } else { + // BACKWARDS COMPATIBLITY + std::string value = getstringfield_default(L, index, "metadata", ""); + istack.metadata.setString("", value); + } + + return istack; + } else { throw LuaError("Expecting itemstack, itemstring, table or nil"); } } diff --git a/src/script/lua_api/CMakeLists.txt b/src/script/lua_api/CMakeLists.txt index efccce515..070234eba 100644 --- a/src/script/lua_api/CMakeLists.txt +++ b/src/script/lua_api/CMakeLists.txt @@ -5,6 +5,7 @@ set(common_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_env.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_inventory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_item.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_itemstackmeta.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_mapgen.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_metadata.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_nodemeta.cpp diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 3d9db7917..2722e35a4 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -284,7 +284,7 @@ int ModApiEnvMod::l_place_node(lua_State *L) return 1; } // Create item to place - ItemStack item(ndef->get(n).name, 1, 0, "", idef); + ItemStack item(ndef->get(n).name, 1, 0, idef); // Make pointed position PointedThing pointed; pointed.type = POINTEDTHING_NODE; diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index ff0baea14..f0293bed8 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "lua_api/l_item.h" +#include "lua_api/l_itemstackmeta.h" #include "lua_api/l_internal.h" #include "common/c_converter.h" #include "common/c_content.h" @@ -137,16 +138,28 @@ int LuaItemStack::l_set_wear(lua_State *L) return 1; } +// get_meta(self) -> string +int LuaItemStack::l_get_meta(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + ItemStackMetaRef::create(L, &o->m_stack); + return 1; +} + +// DEPRECATED // get_metadata(self) -> string int LuaItemStack::l_get_metadata(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaItemStack *o = checkobject(L, 1); ItemStack &item = o->m_stack; - lua_pushlstring(L, item.metadata.c_str(), item.metadata.size()); + const std::string &value = item.metadata.getString(""); + lua_pushlstring(L, value.c_str(), value.size()); return 1; } +// DEPRECATED // set_metadata(self, string) int LuaItemStack::l_set_metadata(lua_State *L) { @@ -156,7 +169,7 @@ int LuaItemStack::l_set_metadata(lua_State *L) size_t len = 0; const char *ptr = luaL_checklstring(L, 2, &len); - item.metadata.assign(ptr, len); + item.metadata.setString("", std::string(ptr, len)); lua_pushboolean(L, true); return 1; @@ -211,8 +224,24 @@ int LuaItemStack::l_to_table(lua_State *L) lua_setfield(L, -2, "count"); lua_pushinteger(L, item.wear); lua_setfield(L, -2, "wear"); - lua_pushlstring(L, item.metadata.c_str(), item.metadata.size()); - lua_setfield(L, -2, "metadata"); + + if (item.metadata.size() == 1 && item.metadata.contains("")) { + const std::string &value = item.metadata.getString(""); + lua_pushlstring(L, value.c_str(), value.size()); + lua_setfield(L, -2, "metadata"); + } else { + lua_newtable(L); + const StringMap &fields = item.metadata.getStrings(); + for (StringMap::const_iterator it = fields.begin(); + it != fields.end(); ++it) { + const std::string &name = it->first; + const std::string &value = it->second; + lua_pushlstring(L, name.c_str(), name.size()); + lua_pushlstring(L, value.c_str(), value.size()); + lua_settable(L, -3); + } + lua_setfield(L, -2, "metadata"); + } } return 1; } @@ -443,6 +472,7 @@ const luaL_reg LuaItemStack::methods[] = { luamethod(LuaItemStack, set_count), luamethod(LuaItemStack, get_wear), luamethod(LuaItemStack, set_wear), + luamethod(LuaItemStack, get_meta), luamethod(LuaItemStack, get_metadata), luamethod(LuaItemStack, set_metadata), luamethod(LuaItemStack, clear), diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index be919b701..1ba5d79e0 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -56,9 +56,14 @@ private: // set_wear(self, number) static int l_set_wear(lua_State *L); + // get_meta(self) -> string + static int l_get_meta(lua_State *L); + + // DEPRECATED // get_metadata(self) -> string static int l_get_metadata(lua_State *L); + // DEPRECATED // set_metadata(self, string) static int l_set_metadata(lua_State *L); diff --git a/src/script/lua_api/l_itemstackmeta.cpp b/src/script/lua_api/l_itemstackmeta.cpp new file mode 100644 index 000000000..304a7cdf3 --- /dev/null +++ b/src/script/lua_api/l_itemstackmeta.cpp @@ -0,0 +1,115 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +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 "lua_api/l_itemstackmeta.h" +#include "lua_api/l_internal.h" +#include "common/c_content.h" + +/* + NodeMetaRef +*/ +ItemStackMetaRef* ItemStackMetaRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(ItemStackMetaRef**)ud; // unbox pointer +} + +Metadata* ItemStackMetaRef::getmeta(bool auto_create) +{ + return &istack->metadata; +} + +void ItemStackMetaRef::clearMeta() +{ + istack->metadata.clear(); +} + +void ItemStackMetaRef::reportMetadataChange() +{ + // TODO +} + +// Exported functions + +// garbage collector +int ItemStackMetaRef::gc_object(lua_State *L) { + ItemStackMetaRef *o = *(ItemStackMetaRef **)(lua_touserdata(L, 1)); + delete o; + return 0; +} + +// Creates an NodeMetaRef and leaves it on top of stack +// Not callable from Lua; all references are created on the C side. +void ItemStackMetaRef::create(lua_State *L, ItemStack *istack) +{ + ItemStackMetaRef *o = new ItemStackMetaRef(istack); + //infostream<<"NodeMetaRef::create: o="< + +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 L_ITEMSTACKMETA_H_ +#define L_ITEMSTACKMETA_H_ + +#include "lua_api/l_base.h" +#include "lua_api/l_metadata.h" +#include "irrlichttypes_bloated.h" +#include "inventory.h" + +class ItemStackMetaRef : public MetaDataRef +{ +private: + ItemStack *istack; + + static const char className[]; + static const luaL_reg methods[]; + + static ItemStackMetaRef *checkobject(lua_State *L, int narg); + + virtual Metadata* getmeta(bool auto_create); + + virtual void clearMeta(); + + virtual void reportMetadataChange(); + + // Exported functions + + // garbage collector + static int gc_object(lua_State *L); +public: + ItemStackMetaRef(ItemStack *istack): istack(istack) {} + ~ItemStackMetaRef() {} + + // Creates an ItemStackMetaRef and leaves it on top of stack + // Not callable from Lua; all references are created on the C side. + static void create(lua_State *L, ItemStack *istack); + + static void Register(lua_State *L); +}; + +#endif diff --git a/src/script/scripting_game.cpp b/src/script/scripting_game.cpp index e313d55f8..7becef6dc 100644 --- a/src/script/scripting_game.cpp +++ b/src/script/scripting_game.cpp @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_env.h" #include "lua_api/l_inventory.h" #include "lua_api/l_item.h" +#include "lua_api/l_itemstackmeta.h" #include "lua_api/l_mapgen.h" #include "lua_api/l_nodemeta.h" #include "lua_api/l_nodetimer.h" @@ -94,6 +95,7 @@ void GameScripting::InitializeModApi(lua_State *L, int top) // Register reference classes (userdata) InvRef::Register(L); + ItemStackMetaRef::Register(L); LuaAreaStore::Register(L); LuaItemStack::Register(L); LuaPerlinNoise::Register(L); diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index 99cb990f1..61d369bc4 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -354,6 +354,55 @@ std::string deSerializeJsonString(std::istream &is) return os.str(); } +std::string serializeJsonStringIfNeeded(const std::string &s) +{ + for (size_t i = 0; i < s.size(); ++i) { + if (s[i] <= 0x1f || s[i] >= 0x7f || s[i] == ' ' || s[i] == '\"') + return serializeJsonString(s); + } + return s; +} + +std::string deSerializeJsonStringIfNeeded(std::istream &is) +{ + std::ostringstream tmp_os; + bool expect_initial_quote = true; + bool is_json = false; + bool was_backslash = false; + for (;;) { + char c = is.get(); + if (is.eof()) + break; + + if (expect_initial_quote && c == '"') { + tmp_os << c; + is_json = true; + } else if(is_json) { + tmp_os << c; + if (was_backslash) + was_backslash = false; + else if (c == '\\') + was_backslash = true; + else if (c == '"') + break; // Found end of string + } else { + if (c == ' ') { + // Found end of word + is.unget(); + break; + } else { + tmp_os << c; + } + } + expect_initial_quote = false; + } + if (is_json) { + std::istringstream tmp_is(tmp_os.str(), std::ios::binary); + return deSerializeJsonString(tmp_is); + } else + return tmp_os.str(); +} + //// //// String/Struct conversions //// diff --git a/src/util/serialize.h b/src/util/serialize.h index 36324a675..e22434191 100644 --- a/src/util/serialize.h +++ b/src/util/serialize.h @@ -405,6 +405,13 @@ std::string serializeJsonString(const std::string &plain); // Reads a string encoded in JSON format std::string deSerializeJsonString(std::istream &is); +// If the string contains spaces, quotes or control characters, encodes as JSON. +// Else returns the string unmodified. +std::string serializeJsonStringIfNeeded(const std::string &s); + +// Parses a string serialized by serializeJsonStringIfNeeded. +std::string deSerializeJsonStringIfNeeded(std::istream &is); + // Creates a string consisting of the hexadecimal representation of `data` std::string serializeHexString(const std::string &data, bool insert_spaces=false); From f2f9a923515386d787a245fac52f78e815b3a839 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 3 Feb 2017 22:28:09 +0000 Subject: [PATCH 121/586] Add per-stack descriptions using ItemStack Metadata --- doc/lua_api.txt | 4 ++++ src/guiFormSpecMenu.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 2f5e3706c..dd20ae904 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1473,6 +1473,10 @@ Item stacks can store metadata too. See `ItemStackMetaRef`. Item metadata only contains a key-value store. +Some of the values in the key-value store are handled specially: + +* `description`: Set the itemstack's description. Defaults to idef.description + Example stuff: local meta = stack:get_meta() diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index 45b0e9c11..67b3a9ad0 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -2303,7 +2303,12 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase, // Draw tooltip std::wstring tooltip_text = L""; if (hovering && !m_selected_item) { - tooltip_text = utf8_to_wide(item.getDefinition(m_client->idef()).description); + const std::string &desc = item.metadata.getString("description"); + if (desc.empty()) + tooltip_text = + utf8_to_wide(item.getDefinition(m_client->idef()).description); + else + tooltip_text = utf8_to_wide(desc); } if (tooltip_text != L"") { std::vector tt_rows = str_split(tooltip_text, L'\n'); From 80c75272a6ffff34069ed470e959f7ff007e6c06 Mon Sep 17 00:00:00 2001 From: numberZero Date: Sun, 5 Feb 2017 13:27:58 +0400 Subject: [PATCH 122/586] Improve mesh shading (#5172) --- src/mesh.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index 84689b631..6a055abb2 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -44,12 +44,13 @@ void applyFacesShading(video::SColor &color, const v3f &normal) { // Many special drawtypes have normals set to 0,0,0 and this // must result in maximum brightness (no face shadng). - if (normal.Y < -0.5f) - applyShadeFactor (color, 0.447213f); - else if (normal.X > 0.5f || normal.X < -0.5f) - applyShadeFactor (color, 0.670820f); - else if (normal.Z > 0.5f || normal.Z < -0.5f) - applyShadeFactor (color, 0.836660f); + float x2 = normal.X * normal.X; + float y2 = normal.Y * normal.Y; + float z2 = normal.Z * normal.Z; + if (normal.Y < 0) + applyShadeFactor(color, 0.670820f * x2 + 0.447213f * y2 + 0.836660f * z2); + else if ((x2 > 1e-3) || (z2 > 1e-3)) + applyShadeFactor(color, 0.670820f * x2 + 1.000000f * y2 + 0.836660f * z2); } scene::IAnimatedMesh* createCubeMesh(v3f scale) From 3e30731c1ac313b504ff15eb7f40ce6a387d3da2 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sun, 5 Feb 2017 23:59:18 -0800 Subject: [PATCH 123/586] Prevent SIGFPE on entity tile loading issue. (#5178) While experimenting with entities I ran into this unresolvable error where the server is sending some texture that the client crashes on. The crash prevents the client from ever reconnecting, resulting in a server that has to use clearobjects. We shouldn't crash but just ignore the object and move on. ``` 0x00000000004dc0de in TextureSource::generateImagePart (this=this@entry=0x7118eb0, part_of_name="[applyfiltersformesh", baseimg=@0x7fffffffbe98: 0x9f1b010) at /home/sofar/git/minetest/src/client/tile.cpp:1744 1744 u32 xscale = scaleto / dim.Width; (gdb) bt #0 0x00000000004dc0de in TextureSource::generateImagePart (this=this@entry=0x7118eb0, part_of_name="[applyfiltersformesh", baseimg=@0x7fffffffbe98: 0x9f1b010) at /home/sofar/git/minetest/src/client/tile.cpp:1744 ``` After reconnecting, the client now can connect without issues and displays an error message: ``` ERROR[Main]: generateImagePart(): Illegal 0 dimension for part_of_name="[applyfiltersformesh", cancelling. ERROR[Main]: generateImage(): Failed to generate "[applyfiltersformesh" ERROR[Main]: Irrlicht: Invalid size of image for OpenGL Texture. ``` --- src/client/tile.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/client/tile.cpp b/src/client/tile.cpp index fbc0f1709..000c766d0 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1741,6 +1741,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, * equal to the target minimum. If e.g. this is a vertical frames * animation, the short dimension will be the real size. */ + if ((dim.Width == 0) || (dim.Height == 0)) { + errorstream << "generateImagePart(): Illegal 0 dimension " + << "for part_of_name=\""<< part_of_name + << "\", cancelling." << std::endl; + return false; + } u32 xscale = scaleto / dim.Width; u32 yscale = scaleto / dim.Height; u32 scale = (xscale > yscale) ? xscale : yscale; From 5da3ed19a38ba5a342ba16c61be7bfb7c17b2308 Mon Sep 17 00:00:00 2001 From: Travis Burtrum Date: Mon, 6 Feb 2017 13:10:03 -0500 Subject: [PATCH 124/586] Add support for unix socket connection to redis (#5179) --- src/database-redis.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/database-redis.cpp b/src/database-redis.cpp index 3bcedad9b..3df186944 100644 --- a/src/database-redis.cpp +++ b/src/database-redis.cpp @@ -44,7 +44,8 @@ Database_Redis::Database_Redis(Settings &conf) } const char *addr = tmp.c_str(); int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379; - ctx = redisConnect(addr, port); + // if redis_address contains '/' assume unix socket, else hostname/ip + ctx = tmp.find('/') != std::string::npos ? redisConnectUnix(addr) : redisConnect(addr, port); if (!ctx) { throw DatabaseException("Cannot allocate redis context"); } else if (ctx->err) { From 8bc6a303b461662b7434a5ee8557292d43682cc9 Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 6 Feb 2017 21:48:54 +0000 Subject: [PATCH 125/586] Face shading: Add shade factor comments --- src/mesh.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index 6a055abb2..a79264ef0 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -42,8 +42,15 @@ inline static void applyShadeFactor(video::SColor& color, float factor) void applyFacesShading(video::SColor &color, const v3f &normal) { - // Many special drawtypes have normals set to 0,0,0 and this - // must result in maximum brightness (no face shadng). + /* + Some drawtypes have normals set to (0, 0, 0), this must result in + maximum brightness: shade factor 1.0. + Shade factors for aligned cube faces are: + +Y 1.000000 sqrt(1.0) + -Y 0.447213 sqrt(0.2) + +-X 0.670820 sqrt(0.45) + +-Z 0.836660 sqrt(0.7) + */ float x2 = normal.X * normal.X; float y2 = normal.Y * normal.Y; float z2 = normal.Z * normal.Z; From 0680c47d6c7d3e98e2b96b823f8cc9ca76d5e7f8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 5 Feb 2017 18:15:46 +0000 Subject: [PATCH 126/586] Fix incompatibility of ItemStack.to_table() introduced by stack meta --- src/script/common/c_content.cpp | 15 +++++++++++++++ src/script/lua_api/l_item.cpp | 28 +++++++++++++--------------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 8925b51f4..399aa88d0 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -848,6 +848,21 @@ ItemStack read_item(lua_State* L, int index,Server* srv) istack.metadata.setString("", value); } + lua_getfield(L, index, "meta"); + fieldstable = lua_gettop(L); + if (lua_istable(L, fieldstable)) { + lua_pushnil(L); + while (lua_next(L, fieldstable) != 0) { + // key at index -2 and value at index -1 + std::string key = lua_tostring(L, -2); + size_t value_len; + const char *value_cs = lua_tolstring(L, -1, &value_len); + std::string value(value_cs, value_len); + istack.metadata.setString(name, value); + lua_pop(L, 1); // removes value, keeps key for next iteration + } + } + return istack; } else { throw LuaError("Expecting itemstack, itemstring, table or nil"); diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index f0293bed8..9638740e8 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -225,23 +225,21 @@ int LuaItemStack::l_to_table(lua_State *L) lua_pushinteger(L, item.wear); lua_setfield(L, -2, "wear"); - if (item.metadata.size() == 1 && item.metadata.contains("")) { - const std::string &value = item.metadata.getString(""); + const std::string &metadata_str = item.metadata.getString(""); + lua_pushlstring(L, metadata_str.c_str(), metadata_str.size()); + lua_setfield(L, -2, "metadata"); + + lua_newtable(L); + const StringMap &fields = item.metadata.getStrings(); + for (StringMap::const_iterator it = fields.begin(); + it != fields.end(); ++it) { + const std::string &name = it->first; + const std::string &value = it->second; + lua_pushlstring(L, name.c_str(), name.size()); lua_pushlstring(L, value.c_str(), value.size()); - lua_setfield(L, -2, "metadata"); - } else { - lua_newtable(L); - const StringMap &fields = item.metadata.getStrings(); - for (StringMap::const_iterator it = fields.begin(); - it != fields.end(); ++it) { - const std::string &name = it->first; - const std::string &value = it->second; - lua_pushlstring(L, name.c_str(), name.size()); - lua_pushlstring(L, value.c_str(), value.size()); - lua_settable(L, -3); - } - lua_setfield(L, -2, "metadata"); + lua_settable(L, -3); } + lua_setfield(L, -2, "meta"); } return 1; } From ef6feca501fcf0d5a1fd2021f1d4df96a4533f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Wed, 8 Feb 2017 00:15:55 +0100 Subject: [PATCH 127/586] Add ModMetadata API (#5131) * mod can create a ModMetadata object where store its values and retrieve it. * Modmetadata object can only be fetched at mod loading * Save when modified using same time as map interval or at server stop * add helper function to get mod storage path * ModMetadata has exactly same calls than all every other Metadata --- doc/lua_api.txt | 10 ++- src/metadata.cpp | 20 ++++- src/metadata.h | 2 +- src/mods.cpp | 80 ++++++++++++++++- src/mods.h | 21 +++++ src/remoteplayer.cpp | 2 +- src/script/lua_api/CMakeLists.txt | 1 + src/script/lua_api/l_storage.cpp | 143 ++++++++++++++++++++++++++++++ src/script/lua_api/l_storage.h | 62 +++++++++++++ src/script/scripting_game.cpp | 3 + src/server.cpp | 43 ++++++++- src/server.h | 9 +- 12 files changed, 384 insertions(+), 12 deletions(-) create mode 100644 src/script/lua_api/l_storage.cpp create mode 100644 src/script/lua_api/l_storage.h diff --git a/doc/lua_api.txt b/doc/lua_api.txt index dd20ae904..4774e8a5a 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2629,6 +2629,11 @@ These functions return the leftover itemstack. * `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult * Return response data for given asynchronous HTTP request +### Storage API: +* `minetest.get_mod_storage()`: + * returns reference to mod private `StorageRef` + * must be called during mod load time + ### Misc. * `minetest.get_connected_players()`: returns list of `ObjectRefs` * `minetest.player_exists(name)`: boolean, whether player exists (regardless of online status) @@ -2791,7 +2796,7 @@ Class reference --------------- ### `MetaDataRef` -See `NodeMetaRef` and `ItemStackMetaRef`. +See `StorageRef`, `NodeMetaRef` and `ItemStackMetaRef`. #### Methods * `set_string(name, value)` @@ -2845,6 +2850,9 @@ Can be gotten via `minetest.get_node_timer(pos)`. * `is_started()`: returns boolean state of timer * returns `true` if timer is started, otherwise `false` +### `StorageRef` +This is basically a reference to a C++ `ModMetadata` + ### `ObjectRef` Moving things in the game are generally these. diff --git a/src/metadata.cpp b/src/metadata.cpp index 3cc45f919..2ce9af5af 100644 --- a/src/metadata.cpp +++ b/src/metadata.cpp @@ -76,13 +76,27 @@ const std::string &Metadata::getString(const std::string &name, return resolveString(it->second, recursion); } -void Metadata::setString(const std::string &name, const std::string &var) +/** + * Sets var to name key in the metadata storage + * + * @param name + * @param var + * @return true if key-value pair is created or changed + */ +bool Metadata::setString(const std::string &name, const std::string &var) { if (var.empty()) { m_stringvars.erase(name); - } else { - m_stringvars[name] = var; + return true; } + + StringMap::iterator it = m_stringvars.find(name); + if (it != m_stringvars.end() && it->second == var) { + return false; + } + + m_stringvars[name] = var; + return true; } const std::string &Metadata::resolveString(const std::string &str, diff --git a/src/metadata.h b/src/metadata.h index 4bb3c2ee7..a8270b4c4 100644 --- a/src/metadata.h +++ b/src/metadata.h @@ -46,7 +46,7 @@ public: size_t size() const; bool contains(const std::string &name) const; const std::string &getString(const std::string &name, u16 recursion = 0) const; - void setString(const std::string &name, const std::string &var); + virtual bool setString(const std::string &name, const std::string &var); const StringMap &getStrings() const { return m_stringvars; diff --git a/src/mods.cpp b/src/mods.cpp index 1b1bdb07b..bae9a42d3 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -21,13 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "mods.h" #include "filesys.h" -#include "util/strfnd.h" #include "log.h" #include "subgame.h" #include "settings.h" -#include "util/strfnd.h" #include "convert_json.h" -#include "exceptions.h" static bool parseDependsLine(std::istream &is, std::string &dep, std::set &symbols) @@ -356,3 +353,80 @@ Json::Value getModstoreUrl(std::string url) } #endif + +ModMetadata::ModMetadata(const std::string &mod_name): + m_mod_name(mod_name), + m_modified(false) +{ + m_stringvars.clear(); +} + +void ModMetadata::clear() +{ + Metadata::clear(); + m_modified = true; +} + +bool ModMetadata::save(const std::string &root_path) +{ + Json::Value json; + for (StringMap::const_iterator it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + json[it->first] = it->second; + } + + if (!fs::PathExists(root_path)) { + if (!fs::CreateAllDirs(root_path)) { + errorstream << "ModMetadata[" << m_mod_name << "]: Unable to save. '" + << root_path << "' tree cannot be created." << std::endl; + return false; + } + } else if (!fs::IsDir(root_path)) { + errorstream << "ModMetadata[" << m_mod_name << "]: Unable to save. '" + << root_path << "' is not a directory." << std::endl; + return false; + } + + bool w_ok = fs::safeWriteToFile(root_path + DIR_DELIM + m_mod_name, + Json::FastWriter().write(json)); + + if (w_ok) { + m_modified = false; + } else { + errorstream << "ModMetadata[" << m_mod_name << "]: failed write file." << std::endl; + } + return w_ok; +} + +bool ModMetadata::load(const std::string &root_path) +{ + m_stringvars.clear(); + + std::ifstream is((root_path + DIR_DELIM + m_mod_name).c_str(), std::ios_base::binary); + if (!is.good()) { + return false; + } + + Json::Reader reader; + Json::Value root; + if (!reader.parse(is, root)) { + errorstream << "ModMetadata[" << m_mod_name << "]: failed read data " + "(Json decoding failure)." << std::endl; + return false; + } + + const Json::Value::Members attr_list = root.getMemberNames(); + for (Json::Value::Members::const_iterator it = attr_list.begin(); + it != attr_list.end(); ++it) { + Json::Value attr_value = root[*it]; + m_stringvars[*it] = attr_value.asString(); + } + + return true; +} + +bool ModMetadata::setString(const std::string &name, const std::string &var) +{ + m_modified = Metadata::setString(name, var); + return m_modified; +} diff --git a/src/mods.h b/src/mods.h index af7777d18..61af5e5d1 100644 --- a/src/mods.h +++ b/src/mods.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include "config.h" +#include "metadata.h" #define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_" @@ -205,4 +206,24 @@ struct ModStoreModDetails { bool valid; }; +class ModMetadata: public Metadata +{ +public: + ModMetadata(const std::string &mod_name); + ~ModMetadata() {} + + virtual void clear(); + + bool save(const std::string &root_path); + bool load(const std::string &root_path); + + bool isModified() const { return m_modified; } + const std::string &getModName() const { return m_mod_name; } + + virtual bool setString(const std::string &name, const std::string &var); +private: + std::string m_mod_name; + bool m_modified; +}; + #endif diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index 6853ad6d9..0a4591410 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -174,7 +174,7 @@ void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, const Json::Value::Members attr_list = attr_root.getMemberNames(); for (Json::Value::Members::const_iterator it = attr_list.begin(); - it != attr_list.end(); ++it) { + it != attr_list.end(); ++it) { Json::Value attr_value = attr_root[*it]; sao->setExtendedAttribute(*it, attr_value.asString()); } diff --git a/src/script/lua_api/CMakeLists.txt b/src/script/lua_api/CMakeLists.txt index 070234eba..e82560696 100644 --- a/src/script/lua_api/CMakeLists.txt +++ b/src/script/lua_api/CMakeLists.txt @@ -15,6 +15,7 @@ set(common_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_particles.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_rollback.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_server.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_util.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_vmanip.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_settings.cpp diff --git a/src/script/lua_api/l_storage.cpp b/src/script/lua_api/l_storage.cpp new file mode 100644 index 000000000..42928255f --- /dev/null +++ b/src/script/lua_api/l_storage.cpp @@ -0,0 +1,143 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola +Copyright (C) 2017 nerzhul, Loic Blot + +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 "lua_api/l_storage.h" +#include "l_internal.h" +#include "mods.h" +#include "server.h" + +int ModApiStorage::l_get_mod_storage(lua_State *L) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + if (!lua_isstring(L, -1)) { + return 0; + } + + std::string mod_name = lua_tostring(L, -1); + + ModMetadata *store = new ModMetadata(mod_name); + // For server side + if (Server *server = getServer(L)) { + store->load(server->getModStoragePath()); + server->registerModStorage(store); + } else { + assert(false); // this should not happen + } + + StorageRef::create(L, store); + int object = lua_gettop(L); + + lua_pushvalue(L, object); + return 1; +} + +void ModApiStorage::Initialize(lua_State *L, int top) +{ + API_FCT(get_mod_storage); +} + +StorageRef::StorageRef(ModMetadata *object): + m_object(object) +{ +} + +void StorageRef::create(lua_State *L, ModMetadata *object) +{ + StorageRef *o = new StorageRef(object); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + +int StorageRef::gc_object(lua_State *L) +{ + StorageRef *o = *(StorageRef **)(lua_touserdata(L, 1)); + // Server side + if (Server *server = getServer(L)) + server->unregisterModStorage(getobject(o)->getModName()); + delete o; + return 0; +} + +void StorageRef::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); // hide metatable from Lua getmetatable() + + lua_pushliteral(L, "metadata_class"); + lua_pushlstring(L, className, strlen(className)); + lua_settable(L, metatable); + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pop(L, 1); // drop metatable + + luaL_openlib(L, 0, methods, 0); // fill methodtable + lua_pop(L, 1); // drop methodtable +} + +StorageRef* StorageRef::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + void *ud = luaL_checkudata(L, narg, className); + if (!ud) luaL_typerror(L, narg, className); + return *(StorageRef**)ud; // unbox pointer +} + +ModMetadata* StorageRef::getobject(StorageRef *ref) +{ + ModMetadata *co = ref->m_object; + return co; +} + +Metadata* StorageRef::getmeta(bool auto_create) +{ + return m_object; +} + +void StorageRef::clearMeta() +{ + m_object->clear(); +} + +const char StorageRef::className[] = "StorageRef"; +const luaL_reg StorageRef::methods[] = { + luamethod(MetaDataRef, get_string), + luamethod(MetaDataRef, set_string), + luamethod(MetaDataRef, get_int), + luamethod(MetaDataRef, set_int), + luamethod(MetaDataRef, get_float), + luamethod(MetaDataRef, set_float), + luamethod(MetaDataRef, to_table), + luamethod(MetaDataRef, from_table), + {0,0} +}; diff --git a/src/script/lua_api/l_storage.h b/src/script/lua_api/l_storage.h new file mode 100644 index 000000000..fde2828ad --- /dev/null +++ b/src/script/lua_api/l_storage.h @@ -0,0 +1,62 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola +Copyright (C) 2017 nerzhul, Loic Blot + +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 __L_STORAGE_H__ +#define __L_STORAGE_H__ + +#include "lua_api/l_base.h" +#include "l_metadata.h" + +class ModMetadata; + +class ModApiStorage: public ModApiBase +{ +protected: + static int l_get_mod_storage(lua_State *L); +public: + static void Initialize(lua_State *L, int top); + +}; + +class StorageRef: public MetaDataRef +{ +private: + ModMetadata *m_object; + + static const char className[]; + static const luaL_reg methods[]; + + virtual Metadata* getmeta(bool auto_create); + virtual void clearMeta(); + + // garbage collector + static int gc_object(lua_State *L); +public: + StorageRef(ModMetadata *object); + ~StorageRef() {} + + static void Register(lua_State *L); + static void create(lua_State *L, ModMetadata *object); + + static StorageRef *checkobject(lua_State *L, int narg); + static ModMetadata* getobject(StorageRef *ref); +}; + +#endif /* __L_STORAGE_H__ */ diff --git a/src/script/scripting_game.cpp b/src/script/scripting_game.cpp index 7becef6dc..4da752263 100644 --- a/src/script/scripting_game.cpp +++ b/src/script/scripting_game.cpp @@ -41,6 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_vmanip.h" #include "lua_api/l_settings.h" #include "lua_api/l_http.h" +#include "lua_api/l_storage.h" extern "C" { #include "lualib.h" @@ -92,6 +93,7 @@ void GameScripting::InitializeModApi(lua_State *L, int top) ModApiServer::Initialize(L, top); ModApiUtil::Initialize(L, top); ModApiHttp::Initialize(L, top); + ModApiStorage::Initialize(L, top); // Register reference classes (userdata) InvRef::Register(L); @@ -108,6 +110,7 @@ void GameScripting::InitializeModApi(lua_State *L, int top) NodeTimerRef::Register(L); ObjectRef::Register(L); LuaSettings::Register(L); + StorageRef::Register(L); } void log_deprecated(const std::string &message) diff --git a/src/server.cpp b/src/server.cpp index e5714ac03..8b9f46f85 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -178,8 +178,8 @@ Server::Server( m_admin_chat(iface), m_ignore_map_edit_events(false), m_ignore_map_edit_events_peer_id(0), - m_next_sound_id(0) - + m_next_sound_id(0), + m_mod_storage_save_timer(10.0f) { m_liquid_transform_timer = 0.0; m_liquid_transform_every = 1.0; @@ -788,6 +788,18 @@ void Server::AsyncRunStep(bool initial_step) << "packet size is " << pktSize << std::endl; } m_clients.unlock(); + + m_mod_storage_save_timer -= dtime; + if (m_mod_storage_save_timer <= 0.0f) { + infostream << "Saving registered mod storages." << std::endl; + m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval"); + for (UNORDERED_MAP::const_iterator + it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) { + if (it->second->isModified()) { + it->second->save(getModStoragePath()); + } + } + } } /* @@ -3404,6 +3416,11 @@ std::string Server::getBuiltinLuaPath() return porting::path_share + DIR_DELIM + "builtin"; } +std::string Server::getModStoragePath() const +{ + return m_path_world + DIR_DELIM + "mod_storage"; +} + v3f Server::findSpawnPos() { ServerMap &map = m_env->getServerMap(); @@ -3525,6 +3542,28 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version return playersao; } +bool Server::registerModStorage(ModMetadata *storage) +{ + if (m_mod_storages.find(storage->getModName()) != m_mod_storages.end()) { + errorstream << "Unable to register same mod storage twice. Storage name: " + << storage->getModName() << std::endl; + return false; + } + + m_mod_storages[storage->getModName()] = storage; + return true; +} + +void Server::unregisterModStorage(const std::string &name) +{ + UNORDERED_MAP::const_iterator it = m_mod_storages.find(name); + if (it != m_mod_storages.end()) { + // Save unconditionaly on unregistration + it->second->save(getModStoragePath()); + m_mod_storages.erase(name); + } +} + void dedicated_server_loop(Server &server, bool &kill) { DSTACK(FUNCTION_NAME); diff --git a/src/server.h b/src/server.h index 8f553ce38..3eee67b78 100644 --- a/src/server.h +++ b/src/server.h @@ -299,7 +299,8 @@ public: const ModSpec* getModSpec(const std::string &modname) const; void getModNames(std::vector &modlist); std::string getBuiltinLuaPath(); - inline std::string getWorldPath() const { return m_path_world; } + inline const std::string &getWorldPath() const { return m_path_world; } + std::string getModStoragePath() const; inline bool isSingleplayer() { return m_simple_singleplayer_mode; } @@ -360,6 +361,9 @@ public: void SendInventory(PlayerSAO* playerSAO); void SendMovePlayer(u16 peer_id); + bool registerModStorage(ModMetadata *storage); + void unregisterModStorage(const std::string &name); + // Bind address Address m_bind_addr; @@ -650,6 +654,9 @@ private: // value = "" (visible to all players) or player name std::map m_detached_inventories_player; + UNORDERED_MAP m_mod_storages; + float m_mod_storage_save_timer; + DISABLE_CLASS_COPY(Server); }; From 607dab2b0dff3ca5bf59263e18f8eaab3c21b946 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 8 Feb 2017 07:47:56 +0100 Subject: [PATCH 128/586] Fix android build This fixes #5190 --- build/android/jni/Android.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 47f37cfa5..accbcca1f 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -319,6 +319,7 @@ LOCAL_SRC_FILES += \ jni/src/script/lua_api/l_server.cpp \ jni/src/script/lua_api/l_settings.cpp \ jni/src/script/lua_api/l_http.cpp \ + jni/src/script/lua_api/l_storage.cpp \ jni/src/script/lua_api/l_util.cpp \ jni/src/script/lua_api/l_vmanip.cpp \ jni/src/script/scripting_game.cpp \ From e2ad76f91087215309012300eb9f1ebdd7fa40ee Mon Sep 17 00:00:00 2001 From: red-001 Date: Sat, 21 Jan 2017 10:44:24 +0000 Subject: [PATCH 129/586] No longer auto-generate a 'guest####' player name when name is empty You can't join most servers with a 'guest####' player name anyway so it's only logical to remove them. --- src/client/clientlauncher.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index 6145e3dde..1ac67a1de 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -403,11 +403,12 @@ bool ClientLauncher::launch_game(std::string &error_message, return false; } - if (menudata.name == "") - menudata.name = std::string("Guest") + itos(myrand_range(1000, 9999)); - else - playername = menudata.name; + if (menudata.name == "" && !simple_singleplayer_mode) { + error_message = gettext("Please choose a name!"); + return false; + } + playername = menudata.name; password = menudata.password; g_settings->set("name", playername); From a5ee7139a591eeffce5171e0df7a76f3c7a1d57e Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 24 Jan 2017 10:16:56 +0000 Subject: [PATCH 130/586] OpenAL sound: Use a simpler distance model In createPlayingSoundAt(), AL_ROLLOFF_FACTOR is not set, so it has the default value of 1.0, this makes the equation of the currently used AL_EXPONENT_DISTANCE distance model identical to the equation of the simpler AL_INVERSE_DISTANCE distance model. Using AL_INVERSE_DISTANCE means an exponent is not processed, exponents are quite intensive to process. There is no change in sound attenuation behaviour. The commented-out AL_ROLLOFF_FACTOR value is removed as it would now have a different effect if used. --- src/sound_openal.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sound_openal.cpp b/src/sound_openal.cpp index 317667f52..b9af9e3a9 100644 --- a/src/sound_openal.cpp +++ b/src/sound_openal.cpp @@ -317,7 +317,7 @@ public: return; } - alDistanceModel(AL_EXPONENT_DISTANCE); + alDistanceModel(AL_INVERSE_DISTANCE); infostream<<"Audio: Initialized: OpenAL "<source_id, AL_SOURCE_RELATIVE, false); alSource3f(sound->source_id, AL_POSITION, pos.X, pos.Y, pos.Z); alSource3f(sound->source_id, AL_VELOCITY, 0, 0, 0); - //alSourcef(sound->source_id, AL_ROLLOFF_FACTOR, 0.7); alSourcef(sound->source_id, AL_REFERENCE_DISTANCE, 30.0); alSourcei(sound->source_id, AL_LOOPING, loop ? AL_TRUE : AL_FALSE); volume = MYMAX(0.0, volume); From 3ad68c052bb4d58892b4d1e8cd6be59ea860df8f Mon Sep 17 00:00:00 2001 From: Lars Hofhansl Date: Sat, 4 Feb 2017 16:35:54 -0800 Subject: [PATCH 131/586] Perform mesh animation only once per frame. --- src/clientmap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 11719539f..fb70a97e9 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -470,7 +470,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) continue; // Mesh animation - { + if (pass == scene::ESNRP_SOLID) { //MutexAutoLock lock(block->mesh_mutex); MapBlockMesh *mapBlockMesh = block->mesh; assert(mapBlockMesh); From 5707b739f38cc5cf651de5b69d91d4f46511dac0 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 8 Feb 2017 23:00:37 -0800 Subject: [PATCH 132/586] Change default nodetimer_interval to 0.2s. (#5193) We want to reduce the chance that we get lots and lots of node timers all happening once a second, because we're better off doing small bits of work as they are available. Reducing this to 0.2 seconds will greatly reduce the total amount of nodetimers that elapse at the same instance, while not effecting total work load. This results in a far better chance of the server keeping up with work loads. --- builtin/settingtypes.txt | 2 +- minetest.conf.example | 2 +- src/defaultsettings.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index c81dde7de..0e8783f83 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -840,7 +840,7 @@ active_block_mgmt_interval (Active Block Management interval) float 2.0 abm_interval (Active Block Modifier interval) float 1.0 # Length of time between NodeTimer execution cycles -nodetimer_interval (NodeTimer interval) float 1.0 +nodetimer_interval (NodeTimer interval) float 0.2 # If enabled, invalid world data won't cause the server to shut down. # Only enable this if you know what you are doing. diff --git a/minetest.conf.example b/minetest.conf.example index 5c7533e93..a90cc7d8e 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1027,7 +1027,7 @@ # Length of time between NodeTimer execution cycles # type: float -# nodetimer_interval = 1.0 +# nodetimer_interval = 0.2 # If enabled, invalid world data won't cause the server to shut down. # Only enable this if you know what you are doing. diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 84046f61c..bdf1f92ca 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -295,7 +295,7 @@ void set_default_settings(Settings *settings) settings->setDefault("dedicated_server_step", "0.1"); settings->setDefault("active_block_mgmt_interval", "2.0"); settings->setDefault("abm_interval", "1.0"); - settings->setDefault("nodetimer_interval", "1.0"); + settings->setDefault("nodetimer_interval", "0.2"); settings->setDefault("ignore_world_load_errors", "false"); settings->setDefault("remote_media", ""); settings->setDefault("debug_log_level", "action"); From 74b670a7930736fb4f43dcb5c9e0a366bf23cad4 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 10 Feb 2017 06:59:38 +0000 Subject: [PATCH 133/586] Correct lua_api.txt docs related to meta (#5198) --- doc/lua_api.txt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 4774e8a5a..0245ee7bd 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2815,7 +2815,7 @@ See `StorageRef`, `NodeMetaRef` and `ItemStackMetaRef`. ### `NodeMetaRef` Node metadata: reference extra data and functionality stored in a node. -Can be gotten via `minetest.get_meta(pos)`. +Can be obtained via `minetest.get_meta(pos)`. #### Methods * All methods in MetaDataRef @@ -2823,7 +2823,14 @@ Can be gotten via `minetest.get_meta(pos)`. ### `ItemStackMetaRef` ItemStack metadata: reference extra data and functionality stored in a stack. -Can be gotten via `item:get_meta()`. +Can be obtained via `item:get_meta()`. + +#### Methods +* All methods in MetaDataRef + +### `StorageRef` +Mod metadata: per mod metadata, saved automatically. +Can be obtained via `minetest.get_mod_storage()` during load time. #### Methods * All methods in MetaDataRef @@ -2850,9 +2857,6 @@ Can be gotten via `minetest.get_node_timer(pos)`. * `is_started()`: returns boolean state of timer * returns `true` if timer is started, otherwise `false` -### `StorageRef` -This is basically a reference to a C++ `ModMetadata` - ### `ObjectRef` Moving things in the game are generally these. @@ -3100,8 +3104,9 @@ an itemstring, a table or `nil`. * `set_count(count)`: Returns boolean whether item was cleared * `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools. * `set_wear(wear)`: Returns boolean whether item was cleared -* `get_metadata()`: Returns metadata (a string attached to an item stack). -* `set_metadata(metadata)`: Returns true. +* `get_meta()`: Returns ItemStackMetaRef. See section for more details +* `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item stack). +* `set_metadata(metadata)`: (DEPRECATED) Returns true. * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. From f5d4494a51a4f38553c10efd51a5c423cd357c87 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 10 Feb 2017 08:19:31 +0100 Subject: [PATCH 134/586] Add textures for air and ignore items (#5196) --- builtin/game/register.lua | 8 ++++---- textures/base/pack/air.png | Bin 0 -> 225 bytes textures/base/pack/ignore.png | Bin 0 -> 234 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 textures/base/pack/air.png create mode 100644 textures/base/pack/ignore.png diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 90f095e9f..ec6f28097 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -331,8 +331,8 @@ core.register_item(":unknown", { core.register_node(":air", { description = "Air (you hacker you!)", - inventory_image = "unknown_node.png", - wield_image = "unknown_node.png", + inventory_image = "air.png", + wield_image = "air.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, @@ -348,8 +348,8 @@ core.register_node(":air", { core.register_node(":ignore", { description = "Ignore (you hacker you!)", - inventory_image = "unknown_node.png", - wield_image = "unknown_node.png", + inventory_image = "ignore.png", + wield_image = "ignore.png", drawtype = "airlike", paramtype = "none", sunlight_propagates = false, diff --git a/textures/base/pack/air.png b/textures/base/pack/air.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c487214455f4b747aa431837f2348fc5ef12c0 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^PC< zb~5}loW1onP=vF_qD8!Q)5>euu zpPQSSR|4cRFzi{kX(o{J^mK6yu{fRl;@;2C_RInkyn|T|v;`bhnYHVIy}*U@tp6u6 z?Bbq~xhTf9$8C?^fiwnY%|_QAMh!iM;|y!oDIDc?R#6qo7n*6p@L|t`&Jf8)6_DYc Lu6{1-oD!Meuu zpPQSSR|4cRFzi{kX(o^g@^ogRTRdI;T-G@yGywq0tw}fl literal 0 HcmV?d00001 From 7bd3e2bceb45a371f3bc7029dbc7729cb3ce42fb Mon Sep 17 00:00:00 2001 From: Craig Robbins Date: Fri, 10 Feb 2017 22:21:23 +1000 Subject: [PATCH 135/586] Revert "Plantlike visual scale: Send sqrt(visual_scale) to old clients" This reverts commit cdc538e0a242167cd7031d40670d2d4464b87f2c. --- src/network/networkprotocol.h | 2 -- src/nodedef.cpp | 10 +++------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 5301cc91c..a511d169b 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -146,8 +146,6 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL VERSION 30: New ContentFeatures serialization version Add node and tile color and palette - Fix plantlike visual_scale being applied squared and add compatibility - with pre-30 clients by sending sqrt(visual_scale) */ #define LATEST_PROTOCOL_VERSION 30 diff --git a/src/nodedef.cpp b/src/nodedef.cpp index c717b62b9..0bb150267 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -1611,10 +1611,6 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const compatible_param_type_2 = CPT2_WALLMOUNTED; } - float compatible_visual_scale = visual_scale; - if (protocol_version < 30 && drawtype == NDT_PLANTLIKE) - compatible_visual_scale = sqrt(visual_scale); - if (protocol_version == 13) { writeU8(os, 5); // version @@ -1626,7 +1622,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, compatible_visual_scale); + writeF1000(os, visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1674,7 +1670,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, compatible_visual_scale); + writeF1000(os, visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1728,7 +1724,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, compatible_visual_scale); + writeF1000(os, visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); From 7760948b7ca436ce0c7d26140dcd3867e81c99c9 Mon Sep 17 00:00:00 2001 From: Craig Robbins Date: Fri, 10 Feb 2017 22:21:49 +1000 Subject: [PATCH 136/586] Revert "Plantlike: Fix visual_scale being applied squared (#5115)" This reverts commit 953cbb3b15997a0e7c7c32af2365cb5046a9e476. --- src/content_mapblock.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 9923647bc..45822666f 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -1602,6 +1602,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data, } for (int i = 0; i < 4; i++) { + vertices[i].Pos *= f.visual_scale; + vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1); if (data->m_smooth_lighting) vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); From bb4db84bdbc7038a6ac495dd5f732f89ac40bfcc Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 27 Dec 2016 23:26:36 +0000 Subject: [PATCH 137/586] Use tree to list mods rather than textlist --- builtin/mainmenu/dlg_config_world.lua | 110 +++++++------------------- builtin/mainmenu/modmgr.lua | 54 ++++++------- builtin/mainmenu/tab_mods.lua | 7 +- 3 files changed, 59 insertions(+), 112 deletions(-) diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua index 7b3ab9852..619c927c5 100644 --- a/builtin/mainmenu/dlg_config_world.lua +++ b/builtin/mainmenu/dlg_config_world.lua @@ -17,14 +17,13 @@ -------------------------------------------------------------------------------- -local enabled_all = false +local enabled_all = false local function modname_valid(name) return not name:find("[^a-z0-9_]") end local function get_formspec(data) - local mod = data.list:get_list()[data.selected_mod] local retval = @@ -32,24 +31,12 @@ local function get_formspec(data) "label[0.5,0;" .. fgettext("World:") .. "]" .. "label[1.75,0;" .. data.worldspec.name .. "]" - if data.hide_gamemods then - retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";true]" - else - retval = retval .. "checkbox[1,6;cb_hide_gamemods;" .. fgettext("Hide Game") .. ";false]" - end - - if data.hide_modpackcontents then - retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";true]" - else - retval = retval .. "checkbox[6,6;cb_hide_mpcontent;" .. fgettext("Hide mp content") .. ";false]" - end - if mod == nil then mod = {name=""} end local hard_deps, soft_deps = modmgr.get_dependencies(mod.path) - + retval = retval .. "label[0,0.7;" .. fgettext("Mod:") .. "]" .. "label[0.75,0.7;" .. mod.name .. "]" .. @@ -62,41 +49,45 @@ local function get_formspec(data) "button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" .. "button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]" - if mod ~= nil and mod.name ~= "" and mod.typ ~= "game_mod" then + if mod and mod.name ~= "" and mod.typ ~= "game_mod" then if mod.is_modpack then local rawlist = data.list:get_raw_list() local all_enabled = true - for j=1,#rawlist,1 do - if rawlist[j].modpack == mod.name and - rawlist[j].enabled ~= true then - all_enabled = false - break + for j = 1, #rawlist, 1 do + if rawlist[j].modpack == mod.name and not rawlist[j].enabled then + all_enabled = false + break end end - if all_enabled == false then - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. fgettext("Enable MP") .. "]" + if all_enabled then + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. + fgettext("Disable MP") .. "]" else - retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_disable;" .. fgettext("Disable MP") .. "]" + retval = retval .. "button[5.5,0.125;2.5,0.5;btn_mp_enable;" .. + fgettext("Enable MP") .. "]" end else if mod.enabled then - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";true]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. + fgettext("enabled") .. ";true]" else - retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. fgettext("enabled") .. ";false]" + retval = retval .. "checkbox[5.5,-0.125;cb_mod_enable;" .. + fgettext("enabled") .. ";false]" end end end - if enabled_all then + if enabled_all then retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" .. - "textlist[5.5,0.75;5.75,5.4;world_config_modlist;" + "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" else retval = retval .. - "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" .. - "textlist[5.5,0.75;5.75,5.4;world_config_modlist;" + "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" end + retval = retval .. + "tablecolumns[color;tree;text]" .. + "table[5.5,0.75;5.75,6;world_config_modlist;" retval = retval .. modmgr.render_modlist(data.list) retval = retval .. ";" .. data.selected_mod .."]" @@ -129,16 +120,15 @@ end local function handle_buttons(this, fields) - if fields["world_config_modlist"] ~= nil then - local event = core.explode_textlist_event(fields["world_config_modlist"]) - this.data.selected_mod = event.index - core.setting_set("world_config_selected_mod", event.index) + local event = core.explode_table_event(fields["world_config_modlist"]) + this.data.selected_mod = event.row + core.setting_set("world_config_selected_mod", event.row) if event.type == "DCL" then enable_mod(this) end - + return true end @@ -160,44 +150,7 @@ local function handle_buttons(this, fields) return true end - if fields["cb_hide_gamemods"] ~= nil or - fields["cb_hide_mpcontent"] ~= nil then - local current = this.data.list:get_filtercriteria() - - if current == nil then - current = {} - end - - if fields["cb_hide_gamemods"] ~= nil then - if core.is_yes(fields["cb_hide_gamemods"]) then - current.hide_game = true - this.data.hide_gamemods = true - core.setting_set("world_config_hide_gamemods", "true") - else - current.hide_game = false - this.data.hide_gamemods = false - core.setting_set("world_config_hide_gamemods", "false") - end - end - - if fields["cb_hide_mpcontent"] ~= nil then - if core.is_yes(fields["cb_hide_mpcontent"]) then - current.hide_modpackcontents = true - this.data.hide_modpackcontents = true - core.setting_set("world_config_hide_modpackcontents", "true") - else - current.hide_modpackcontents = false - this.data.hide_modpackcontents = false - core.setting_set("world_config_hide_modpackcontents", "false") - end - end - - this.data.list:set_filtercriteria(current) - return true - end - if fields["btn_config_world_save"] then - local filename = this.data.worldspec.path .. DIR_DELIM .. "world.mt" @@ -231,7 +184,7 @@ local function handle_buttons(this, fields) if not worldfile:write() then core.log("error", "Failed to write world config file") end - + this:delete() return true end @@ -252,7 +205,7 @@ local function handle_buttons(this, fields) enabled_all = true return true end - + if fields.btn_disable_all_mods then local list = this.data.list:get_raw_list() @@ -269,14 +222,11 @@ local function handle_buttons(this, fields) end function create_configure_world_dlg(worldidx) - local dlg = dialog_create("sp_config_world", get_formspec, handle_buttons, nil) - dlg.data.hide_gamemods = core.setting_getbool("world_config_hide_gamemods") - dlg.data.hide_modpackcontents = core.setting_getbool("world_config_hide_modpackcontents") dlg.data.selected_mod = tonumber(core.setting_get("world_config_selected_mod")) if dlg.data.selected_mod == nil then dlg.data.selected_mod = 0 @@ -286,14 +236,14 @@ function create_configure_world_dlg(worldidx) if dlg.data.worldspec == nil then dlg:delete() return nil end dlg.data.worldconfig = modmgr.get_worldconfig(dlg.data.worldspec.path) - + if dlg.data.worldconfig == nil or dlg.data.worldconfig.id == nil or dlg.data.worldconfig.id == "" then dlg:delete() return nil end - + dlg.data.list = filterlist.create( modmgr.preparemodlist, --refresh modmgr.comparemod, --compare diff --git a/builtin/mainmenu/modmgr.lua b/builtin/mainmenu/modmgr.lua index 2b7b371bf..0fbfa3e6b 100644 --- a/builtin/mainmenu/modmgr.lua +++ b/builtin/mainmenu/modmgr.lua @@ -18,7 +18,7 @@ -------------------------------------------------------------------------------- function get_mods(path,retval,modpack) local mods = core.get_dir_list(path, true) - + for _, name in ipairs(mods) do if name:sub(1, 1) ~= "." then local prefix = path .. DIR_DELIM .. name .. DIR_DELIM @@ -237,49 +237,45 @@ function modmgr.render_modlist(render_list) local list = render_list:get_list() local last_modpack = nil - - for i,v in ipairs(list) do - if retval ~= "" then - retval = retval .."," + local retval = {} + local in_game_mods = false + for i, v in ipairs(list) do + if v.typ == "game_mod" and not in_game_mods then + in_game_mods = true + retval[#retval + 1] = mt_color_blue + retval[#retval + 1] = "0" + retval[#retval + 1] = fgettext("Subgame Mods") end local color = "" - if v.is_modpack then local rawlist = render_list:get_raw_list() + color = mt_color_dark_green - local all_enabled = true - for j=1,#rawlist,1 do + for j = 1, #rawlist, 1 do if rawlist[j].modpack == list[i].name and - rawlist[j].enabled ~= true then - all_enabled = false - break + rawlist[j].enabled ~= true then + -- Modpack not entirely enabled so showing as grey + color = mt_color_grey + break end end - - if all_enabled == false then - color = mt_color_grey - else - color = mt_color_dark_green - end - end - - if v.typ == "game_mod" then + elseif v.typ == "game_mod" then color = mt_color_blue - else - if v.enabled then - color = mt_color_green - end + elseif v.enabled then + color = mt_color_green end - retval = retval .. color - if v.modpack ~= nil then - retval = retval .. " " + retval[#retval + 1] = color + if v.modpack ~= nil or v.typ == "game_mod" then + retval[#retval + 1] = "1" + else + retval[#retval + 1] = "0" end - retval = retval .. v.name + retval[#retval + 1] = core.formspec_escape(v.name) end - return retval + return table.concat(retval, ",") end -------------------------------------------------------------------------------- diff --git a/builtin/mainmenu/tab_mods.lua b/builtin/mainmenu/tab_mods.lua index 4a5b6c041..29afd8a4e 100644 --- a/builtin/mainmenu/tab_mods.lua +++ b/builtin/mainmenu/tab_mods.lua @@ -28,7 +28,8 @@ local function get_formspec(tabview, name, tabdata) local retval = "label[0.05,-0.25;".. fgettext("Installed Mods:") .. "]" .. - "textlist[0,0.25;5.1,5;modlist;" .. + "tablecolumns[color;tree;text]" .. + "table[0,0.25;5.1,5;modlist;" .. modmgr.render_modlist(modmgr.global_mods) .. ";" .. tabdata.selected_mod .. "]" @@ -127,8 +128,8 @@ end -------------------------------------------------------------------------------- local function handle_buttons(tabview, fields, tabname, tabdata) if fields["modlist"] ~= nil then - local event = core.explode_textlist_event(fields["modlist"]) - tabdata.selected_mod = event.index + local event = core.explode_table_event(fields["modlist"]) + tabdata.selected_mod = event.row return true end From 1de08e196182498a931b496f79b1c1eaf3de7ca4 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 10 Feb 2017 17:15:22 +0000 Subject: [PATCH 138/586] Plantlike: Fix visual_scale being applied squared This re-applies 2 commits that were reverted. Visual_scale was applied twice to plantlike by accident sometime between 2011 and 2013, squaring the requested scale value. Visual_scale is correctly applied once in it's other uses in signlike and torchlike. Two lines of code are removed, they also had no effect for the vast majority of nodes with the default visual_scale of 1.0. The texture continues to have it's base at ground level. Send sqrt(visual_scale) to old clients. Keep compatibility with protocol < 30 clients now that visual_scale is no longer applied twice to plantlike drawtype and mods are being updated to a new value. --- src/content_mapblock.cpp | 2 -- src/network/networkprotocol.h | 2 ++ src/nodedef.cpp | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 45822666f..9923647bc 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -1602,8 +1602,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data, } for (int i = 0; i < 4; i++) { - vertices[i].Pos *= f.visual_scale; - vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1); if (data->m_smooth_lighting) vertices[i].Color = blendLight(frame, vertices[i].Pos, tile.color); vertices[i].Pos += intToFloat(p, BS); diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index a511d169b..5301cc91c 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -146,6 +146,8 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL VERSION 30: New ContentFeatures serialization version Add node and tile color and palette + Fix plantlike visual_scale being applied squared and add compatibility + with pre-30 clients by sending sqrt(visual_scale) */ #define LATEST_PROTOCOL_VERSION 30 diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 0bb150267..c717b62b9 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -1611,6 +1611,10 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const compatible_param_type_2 = CPT2_WALLMOUNTED; } + float compatible_visual_scale = visual_scale; + if (protocol_version < 30 && drawtype == NDT_PLANTLIKE) + compatible_visual_scale = sqrt(visual_scale); + if (protocol_version == 13) { writeU8(os, 5); // version @@ -1622,7 +1626,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1670,7 +1674,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); @@ -1724,7 +1728,7 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } writeU8(os, drawtype); - writeF1000(os, visual_scale); + writeF1000(os, compatible_visual_scale); writeU8(os, 6); for (u32 i = 0; i < 6; i++) tiledef[i].serialize(os, protocol_version); From 984e063374c032ed17764931fd00c19afb92ebb9 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 9 Feb 2017 21:12:53 +0000 Subject: [PATCH 139/586] Footsteps: Fix offset footstep and shallow water sound bugs Fix footstep sounds coming from nodes to either side when walking on a 1 node wide row of nodebox slabs such as default:snow. Fix sand footsteps when swimming in 1 node deep water. Use a new function 'getFootstepNodePos()' instead of 'getStandingNodePos()' to avoid using a horizontally-offset 'sneak node' for sounds. Sound is selected from the node BS * 0.05 below the player's feet, so that 1/16th slabs will play the slab sound but 1/32nd slabs will not. If the player is not 'touching ground' the node detection position is changed to BS * 0.5 below to preserve footstep sounds when landing after a jump or fall. --- src/game.cpp | 2 +- src/localplayer.cpp | 12 ++++++++++++ src/localplayer.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/game.cpp b/src/game.cpp index 840403c42..1735737de 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3530,7 +3530,7 @@ void Game::updateSound(f32 dtime) LocalPlayer *player = client->getEnv().getLocalPlayer(); ClientMap &map = client->getEnv().getClientMap(); - MapNode n = map.getNodeNoEx(player->getStandingNodePos()); + MapNode n = map.getNodeNoEx(player->getFootstepNodePos()); soundmaker->m_player_step_sound = nodedef_manager->get(n).sound_footstep; } diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 857d95d8b..33932df0b 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -655,6 +655,18 @@ v3s16 LocalPlayer::getStandingNodePos() return floatToInt(getPosition() - v3f(0, BS, 0), BS); } +v3s16 LocalPlayer::getFootstepNodePos() +{ + if (touching_ground) + // BS * 0.05 below the player's feet ensures a 1/16th height + // nodebox is detected instead of the node below it. + return floatToInt(getPosition() - v3f(0, BS * 0.05f, 0), BS); + // A larger distance below is necessary for a footstep sound + // when landing after a jump or fall. BS * 0.5 ensures water + // sounds when swimming in 1 node deep water. + return floatToInt(getPosition() - v3f(0, BS * 0.5f, 0), BS); +} + v3s16 LocalPlayer::getLightPosition() const { return floatToInt(m_position + v3f(0,BS+BS/2,0), BS); diff --git a/src/localplayer.h b/src/localplayer.h index 685a78cb3..b48dacdb7 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -68,6 +68,7 @@ public: void applyControl(float dtime); v3s16 getStandingNodePos(); + v3s16 getFootstepNodePos(); // Used to check if anything changed and prevent sending packets if not v3f last_position; From 2bd10022cb06850a404f180c455954ed2f817ce3 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Sat, 11 Feb 2017 11:39:41 +0100 Subject: [PATCH 140/586] Mainmenu: Brighter text colours for readability --- builtin/mainmenu/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua index 1b527a053..79e6d5c02 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -16,9 +16,9 @@ --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. mt_color_grey = "#AAAAAA" -mt_color_blue = "#0000DD" -mt_color_green = "#00DD00" -mt_color_dark_green = "#003300" +mt_color_blue = "#6389FF" +mt_color_green = "#72FF63" +mt_color_dark_green = "#25C191" --for all other colors ask sfan5 to complete his work! From f17c9c45dc30a388675d46418d278a4a029206e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Thu, 27 Oct 2016 23:25:44 +0200 Subject: [PATCH 141/586] Lighting: Update lighting at block loading This commit updates mapblocks' light if necessary when they are loaded. This removes ghost lighting. --- src/clientiface.cpp | 6 -- src/map.cpp | 133 ++++++++++++++++------------------- src/mapblock.cpp | 21 +++--- src/mapblock.h | 62 ++++++++++------ src/serialization.h | 5 +- src/voxelalgorithms.cpp | 152 ++++++++++++++++++++++++++++++++++++++-- src/voxelalgorithms.h | 17 ++++- 7 files changed, 274 insertions(+), 122 deletions(-) diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 47730343c..0eb68c9c1 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -283,12 +283,6 @@ void RemoteClient::GetNextBlocks ( surely_not_found_on_disk = true; } - // Block is valid if lighting is up-to-date and data exists - if(block->isValid() == false) - { - block_is_invalid = true; - } - if(block->isGenerated() == false) block_is_invalid = true; diff --git a/src/map.cpp b/src/map.cpp index f2a4b7ffe..ffba77262 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -824,7 +824,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, // Update lighting std::vector > oldnodes; oldnodes.push_back(std::pair(p, oldnode)); - voxalgo::update_lighting_nodes(this, m_nodedef, oldnodes, modified_blocks); + voxalgo::update_lighting_nodes(this, oldnodes, modified_blocks); for(std::map::iterator i = modified_blocks.begin(); @@ -1523,7 +1523,7 @@ void Map::transformLiquids(std::map &modified_blocks) for (std::deque::iterator iter = must_reflow.begin(); iter != must_reflow.end(); ++iter) m_transforming_liquid.push_back(*iter); - voxalgo::update_lighting_nodes(this, m_nodedef, changed_nodes, modified_blocks); + voxalgo::update_lighting_nodes(this, changed_nodes, modified_blocks); /* ---------------------------------------------------------------------- @@ -1955,27 +1955,10 @@ void ServerMap::finishBlockMake(BlockMakeData *data, v3s16 bpmax = data->blockpos_max; v3s16 extra_borders(1, 1, 1); - v3s16 full_bpmin = bpmin - extra_borders; - v3s16 full_bpmax = bpmax + extra_borders; bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; EMERGE_DBG_OUT("finishBlockMake(): " PP(bpmin) " - " PP(bpmax)); - /* - Set lighting to non-expired state in all of them. - This is cheating, but it is not fast enough if all of them - would actually be updated. - */ - for (s16 x = full_bpmin.X; x <= full_bpmax.X; x++) - for (s16 z = full_bpmin.Z; z <= full_bpmax.Z; z++) - for (s16 y = full_bpmin.Y; y <= full_bpmax.Y; y++) { - MapBlock *block = emergeBlock(v3s16(x, y, z), false); - if (!block) - continue; - - block->setLightingExpired(false); - } - /* Blit generated stuff to map NOTE: blitBackAll adds nearly everything to changed_blocks @@ -2991,7 +2974,6 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool // We just loaded it from, so it's up-to-date. block->resetModified(); - } catch(SerializationError &e) { @@ -3015,71 +2997,80 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos) { DSTACK(FUNCTION_NAME); + bool created_new = (getBlockNoCreateNoEx(blockpos) == NULL); + v2s16 p2d(blockpos.X, blockpos.Z); std::string ret; dbase->loadBlock(blockpos, &ret); if (ret != "") { loadBlock(&ret, blockpos, createSector(p2d), false); - return getBlockNoCreateNoEx(blockpos); - } - // Not found in database, try the files + } else { + // Not found in database, try the files - // The directory layout we're going to load from. - // 1 - original sectors/xxxxzzzz/ - // 2 - new sectors2/xxx/zzz/ - // If we load from anything but the latest structure, we will - // immediately save to the new one, and remove the old. - int loadlayout = 1; - std::string sectordir1 = getSectorDir(p2d, 1); - std::string sectordir; - if(fs::PathExists(sectordir1)) - { - sectordir = sectordir1; - } - else - { - loadlayout = 2; - sectordir = getSectorDir(p2d, 2); - } + // The directory layout we're going to load from. + // 1 - original sectors/xxxxzzzz/ + // 2 - new sectors2/xxx/zzz/ + // If we load from anything but the latest structure, we will + // immediately save to the new one, and remove the old. + int loadlayout = 1; + std::string sectordir1 = getSectorDir(p2d, 1); + std::string sectordir; + if (fs::PathExists(sectordir1)) { + sectordir = sectordir1; + } else { + loadlayout = 2; + sectordir = getSectorDir(p2d, 2); + } - /* + /* Make sure sector is loaded - */ + */ - MapSector *sector = getSectorNoGenerateNoEx(p2d); - if(sector == NULL) - { - try{ - sector = loadSectorMeta(sectordir, loadlayout != 2); + MapSector *sector = getSectorNoGenerateNoEx(p2d); + if (sector == NULL) { + try { + sector = loadSectorMeta(sectordir, loadlayout != 2); + } catch(InvalidFilenameException &e) { + return NULL; + } catch(FileNotGoodException &e) { + return NULL; + } catch(std::exception &e) { + return NULL; + } } - catch(InvalidFilenameException &e) - { - return NULL; - } - catch(FileNotGoodException &e) - { - return NULL; - } - catch(std::exception &e) - { + + + /* + Make sure file exists + */ + + std::string blockfilename = getBlockFilename(blockpos); + if (fs::PathExists(sectordir + DIR_DELIM + blockfilename) == false) return NULL; + + /* + Load block and save it to the database + */ + loadBlock(sectordir, blockfilename, sector, true); + } + MapBlock *block = getBlockNoCreateNoEx(blockpos); + if (created_new && (block != NULL)) { + std::map modified_blocks; + // Fix lighting if necessary + voxalgo::update_block_border_lighting(this, block, modified_blocks); + if (!modified_blocks.empty()) { + //Modified lighting, send event + MapEditEvent event; + event.type = MEET_OTHER; + std::map::iterator it; + for (it = modified_blocks.begin(); + it != modified_blocks.end(); ++it) + event.modified_blocks.insert(it->first); + dispatchEvent(&event); } } - - /* - Make sure file exists - */ - - std::string blockfilename = getBlockFilename(blockpos); - if(fs::PathExists(sectordir + DIR_DELIM + blockfilename) == false) - return NULL; - - /* - Load block and save it to the database - */ - loadBlock(sectordir, blockfilename, sector, true); - return getBlockNoCreateNoEx(blockpos); + return block; } bool ServerMap::deleteBlock(v3s16 blockpos) diff --git a/src/mapblock.cpp b/src/mapblock.cpp index f8c3197bc..840cb9b39 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -73,7 +73,7 @@ MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy): m_modified(MOD_STATE_WRITE_NEEDED), m_modified_reason(MOD_REASON_INITIAL), is_underground(false), - m_lighting_expired(true), + m_lighting_complete(0xFFFF), m_day_night_differs(false), m_day_night_differs_expired(true), m_generated(false), @@ -571,11 +571,12 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) flags |= 0x01; if(getDayNightDiff()) flags |= 0x02; - if(m_lighting_expired) - flags |= 0x04; if(m_generated == false) flags |= 0x08; writeU8(os, flags); + if (version >= 27) { + writeU16(os, m_lighting_complete); + } /* Bulk node data @@ -672,7 +673,11 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) u8 flags = readU8(is); is_underground = (flags & 0x01) ? true : false; m_day_night_differs = (flags & 0x02) ? true : false; - m_lighting_expired = (flags & 0x04) ? true : false; + if (version < 27) { + m_lighting_complete = 0xFFFF; + } else { + m_lighting_complete = readU16(is); + } m_generated = (flags & 0x08) ? false : true; /* @@ -783,7 +788,7 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) // Initialize default flags is_underground = false; m_day_night_differs = false; - m_lighting_expired = false; + m_lighting_complete = 0xFFFF; m_generated = true; // Make a temporary buffer @@ -849,7 +854,6 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) is.read((char*)&flags, 1); is_underground = (flags & 0x01) ? true : false; m_day_night_differs = (flags & 0x02) ? true : false; - m_lighting_expired = (flags & 0x04) ? true : false; if(version >= 18) m_generated = (flags & 0x08) ? false : true; @@ -1027,10 +1031,7 @@ std::string analyze_block(MapBlock *block) else desc<<"is_ug [ ], "; - if(block->getLightingExpired()) - desc<<"lighting_exp [X], "; - else - desc<<"lighting_exp [ ], "; + desc<<"lighting_complete: "<getLightingComplete()<<", "; if(block->isDummy()) { diff --git a/src/mapblock.h b/src/mapblock.h index f80800109..5a0ec937a 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -105,7 +105,7 @@ public: #define MOD_REASON_INITIAL (1 << 0) #define MOD_REASON_REALLOCATE (1 << 1) #define MOD_REASON_SET_IS_UNDERGROUND (1 << 2) -#define MOD_REASON_SET_LIGHTING_EXPIRED (1 << 3) +#define MOD_REASON_SET_LIGHTING_COMPLETE (1 << 3) #define MOD_REASON_SET_GENERATED (1 << 4) #define MOD_REASON_SET_NODE (1 << 5) #define MOD_REASON_SET_NODE_NO_CHECK (1 << 6) @@ -213,17 +213,42 @@ public: raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_IS_UNDERGROUND); } - inline void setLightingExpired(bool expired) + inline void setLightingComplete(u16 newflags) { - if (expired != m_lighting_expired){ - m_lighting_expired = expired; - raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_LIGHTING_EXPIRED); + if (newflags != m_lighting_complete) { + m_lighting_complete = newflags; + raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_SET_LIGHTING_COMPLETE); } } - inline bool getLightingExpired() + inline u16 getLightingComplete() { - return m_lighting_expired; + return m_lighting_complete; + } + + inline void setLightingComplete(LightBank bank, u8 direction, + bool is_complete) + { + assert(direction >= 0 && direction <= 5); + if (bank == LIGHTBANK_NIGHT) { + direction += 6; + } + u16 newflags = m_lighting_complete; + if (is_complete) { + newflags |= 1 << direction; + } else { + newflags &= ~(1 << direction); + } + setLightingComplete(newflags); + } + + inline bool isLightingComplete(LightBank bank, u8 direction) + { + assert(direction >= 0 && direction <= 5); + if (bank == LIGHTBANK_NIGHT) { + direction += 6; + } + return (m_lighting_complete & (1 << direction)) != 0; } inline bool isGenerated() @@ -239,15 +264,6 @@ public: } } - inline bool isValid() - { - if (m_lighting_expired) - return false; - if (data == NULL) - return false; - return true; - } - //// //// Position stuff //// @@ -613,14 +629,14 @@ private: */ bool is_underground; - /* - Set to true if changes has been made that make the old lighting - values wrong but the lighting hasn't been actually updated. - - If this is false, lighting is exactly right. - If this is true, lighting might be wrong or right. + /*! + * Each bit indicates if light spreading was finished + * in a direction. (Because the neighbor could also be unloaded.) + * Bits: day X+, day Y+, day Z+, day Z-, day Y-, day X-, + * night X+, night Y+, night Z+, night Z-, night Y-, night X-, + * nothing, nothing, nothing, nothing. */ - bool m_lighting_expired; + u16 m_lighting_complete; // Whether day and night lighting differs bool m_day_night_differs; diff --git a/src/serialization.h b/src/serialization.h index 01d37d363..52c63098e 100644 --- a/src/serialization.h +++ b/src/serialization.h @@ -62,13 +62,14 @@ with this program; if not, write to the Free Software Foundation, Inc., 24: 16-bit node ids and node timers (never released as stable) 25: Improved node timer format 26: Never written; read the same as 25 + 27: Added light spreading flags to blocks */ // This represents an uninitialized or invalid format #define SER_FMT_VER_INVALID 255 // Highest supported serialization version -#define SER_FMT_VER_HIGHEST_READ 26 +#define SER_FMT_VER_HIGHEST_READ 27 // Saved on disk version -#define SER_FMT_VER_HIGHEST_WRITE 25 +#define SER_FMT_VER_HIGHEST_WRITE 27 // Lowest supported serialization version #define SER_FMT_VER_LOWEST_READ 0 // Lowest serialization version for writing diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp index c20917164..3c32bc125 100644 --- a/src/voxelalgorithms.cpp +++ b/src/voxelalgorithms.cpp @@ -423,6 +423,7 @@ void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) { neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos); if (neighbor_block == NULL) { + current.block->setLightingComplete(bank, i, false); continue; } } else { @@ -486,7 +487,8 @@ void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, * \param modified_blocks output, all modified map blocks are added to this */ void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, - LightQueue &light_sources, std::map &modified_blocks) + LightQueue &light_sources, + std::map &modified_blocks) { // The light the current node can provide to its neighbors. u8 spreading_light; @@ -511,6 +513,7 @@ void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank, if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) { neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos); if (neighbor_block == NULL) { + current.block->setLightingComplete(bank, i, false); continue; } } else { @@ -584,10 +587,11 @@ bool is_sunlight_above(Map *map, v3s16 pos, INodeDefManager *ndef) static const LightBank banks[] = { LIGHTBANK_DAY, LIGHTBANK_NIGHT }; -void update_lighting_nodes(Map *map, INodeDefManager *ndef, +void update_lighting_nodes(Map *map, std::vector > &oldnodes, std::map &modified_blocks) { + INodeDefManager *ndef = map->getNodeDefManager(); // For node getter functions bool is_valid_position; @@ -596,6 +600,22 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, LightBank bank = banks[i]; UnlightQueue disappearing_lights(256); ReLightQueue light_sources(256); + // Nodes that are brighter than the brightest modified node was + // won't change, since they didn't get their light from a + // modified node. + u8 min_safe_light = 0; + for (std::vector >::iterator it = + oldnodes.begin(); it < oldnodes.end(); ++it) { + u8 old_light = it->second.getLight(bank, ndef); + if (old_light > min_safe_light) { + min_safe_light = old_light; + } + } + // If only one node changed, even nodes with the same brightness + // didn't get their light from the changed node. + if (oldnodes.size() > 1) { + min_safe_light++; + } // For each changed node process sunlight and initialize for (std::vector >::iterator it = oldnodes.begin(); it < oldnodes.end(); ++it) { @@ -634,11 +654,9 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, MapNode n2 = map->getNodeNoEx(p2, &is_valid); if (is_valid) { u8 spread = n2.getLight(bank, ndef); - // If the neighbor is at least as bright as - // this node then its light is not from - // this node. - // Its light can spread to this node. - if (spread > new_light && spread >= old_light) { + // If it is sure that the neighbor won't be + // unlighted, its light can spread to this node. + if (spread > new_light && spread >= min_safe_light) { new_light = spread - 1; } } @@ -747,6 +765,126 @@ void update_lighting_nodes(Map *map, INodeDefManager *ndef, } } +/*! + * Borders of a map block in relative node coordinates. + * Compatible with type 'direction'. + */ +const VoxelArea block_borders[] = { + VoxelArea(v3s16(15, 0, 0), v3s16(15, 15, 15)), //X+ + VoxelArea(v3s16(0, 15, 0), v3s16(15, 15, 15)), //Y+ + VoxelArea(v3s16(0, 0, 15), v3s16(15, 15, 15)), //Z+ + VoxelArea(v3s16(0, 0, 0), v3s16(15, 15, 0)), //Z- + VoxelArea(v3s16(0, 0, 0), v3s16(15, 0, 15)), //Y- + VoxelArea(v3s16(0, 0, 0), v3s16(0, 15, 15)) //X- +}; + +/*! + * Returns true if: + * -the node has unloaded neighbors + * -the node doesn't have light + * -the node's light is the same as the maximum of + * its light source and its brightest neighbor minus one. + * . + */ +bool is_light_locally_correct(Map *map, INodeDefManager *ndef, LightBank bank, + v3s16 pos) +{ + bool is_valid_position; + MapNode n = map->getNodeNoEx(pos, &is_valid_position); + const ContentFeatures &f = ndef->get(n); + if (f.param_type != CPT_LIGHT) { + return true; + } + u8 light = n.getLightNoChecks(bank, &f); + assert(f.light_source <= LIGHT_MAX); + u8 brightest_neighbor = f.light_source + 1; + for (direction d = 0; d < 6; ++d) { + MapNode n2 = map->getNodeNoEx(pos + neighbor_dirs[d], + &is_valid_position); + u8 light2 = n2.getLight(bank, ndef); + if (brightest_neighbor < light2) { + brightest_neighbor = light2; + } + } + assert(light <= LIGHT_SUN); + return brightest_neighbor == light + 1; +} + +void update_block_border_lighting(Map *map, MapBlock *block, + std::map &modified_blocks) +{ + INodeDefManager *ndef = map->getNodeDefManager(); + bool is_valid_position; + for (s32 i = 0; i < 2; i++) { + LightBank bank = banks[i]; + UnlightQueue disappearing_lights(256); + ReLightQueue light_sources(256); + // Get incorrect lights + for (direction d = 0; d < 6; d++) { + // For each direction + // Get neighbor block + v3s16 otherpos = block->getPos() + neighbor_dirs[d]; + MapBlock *other = map->getBlockNoCreateNoEx(otherpos); + if (other == NULL) { + continue; + } + // Only update if lighting was not completed. + if (block->isLightingComplete(bank, d) && + other->isLightingComplete(bank, 5 - d)) + continue; + // Reset flags + block->setLightingComplete(bank, d, true); + other->setLightingComplete(bank, 5 - d, true); + // The two blocks and their connecting surfaces + MapBlock *blocks[] = {block, other}; + VoxelArea areas[] = {block_borders[d], block_borders[5 - d]}; + // For both blocks + for (u8 blocknum = 0; blocknum < 2; blocknum++) { + MapBlock *b = blocks[blocknum]; + VoxelArea a = areas[blocknum]; + // For all nodes + for (s32 x = a.MinEdge.X; x <= a.MaxEdge.X; x++) + for (s32 z = a.MinEdge.Z; z <= a.MaxEdge.Z; z++) + for (s32 y = a.MinEdge.Y; y <= a.MaxEdge.Y; y++) { + MapNode n = b->getNodeNoCheck(x, y, z, + &is_valid_position); + u8 light = n.getLight(bank, ndef); + // Sunlight is fixed + if (light < LIGHT_SUN) { + // Unlight if not correct + if (!is_light_locally_correct(map, ndef, bank, + v3s16(x, y, z) + b->getPosRelative())) { + // Initialize for unlighting + n.setLight(bank, 0, ndef); + b->setNodeNoCheck(x, y, z, n); + modified_blocks[b->getPos()]=b; + disappearing_lights.push(light, + relative_v3(x, y, z), b->getPos(), b, + 6); + } + } + } + } + } + // Remove lights + unspread_light(map, ndef, bank, disappearing_lights, light_sources, + modified_blocks); + // Initialize light values for light spreading. + for (u8 i = 0; i <= LIGHT_SUN; i++) { + const std::vector &lights = light_sources.lights[i]; + for (std::vector::const_iterator it = lights.begin(); + it < lights.end(); it++) { + MapNode n = it->block->getNodeNoCheck(it->rel_position, + &is_valid_position); + n.setLight(bank, i, ndef); + it->block->setNodeNoCheck(it->rel_position, n); + } + } + // Spread lights. + spread_light(map, ndef, bank, light_sources, modified_blocks); + } +} + VoxelLineIterator::VoxelLineIterator( const v3f &start_position, const v3f &line_vector) : diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 5eff8f7ac..bf1638fa3 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -22,8 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include "mapnode.h" -#include -#include +#include "util/container.h" +#include "util/cpp11_container.h" class Map; class MapBlock; @@ -69,10 +69,21 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a, */ void update_lighting_nodes( Map *map, - INodeDefManager *ndef, std::vector > &oldnodes, std::map &modified_blocks); +/*! + * Updates borders of the given mapblock. + * Only updates if the block was marked with incomplete + * lighting and the neighbor is also loaded. + * + * \param block the block to update + * \param modified_blocks output, contains all map blocks that + * the function modified + */ +void update_block_border_lighting(Map *map, MapBlock *block, + std::map &modified_blocks); + /*! * This class iterates trough voxels that intersect with * a line. The collision detection does not see nodeboxes, From eb49009d023e6e3b5d59a97b8fb5fed5eee83296 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 14 Feb 2017 01:08:17 -0800 Subject: [PATCH 142/586] FreeType: address font license issues (#5230) It appears we were shipping font files without license text, and I had my doubts about the bitmap fonts being usable directly. This replaces existing TTF fonts with Apache-2.0 licensed fonts from chome core (Cousine, Arimo, Tinos). Include the full license file for all three fonts. The Lucida Sans font bitmap is removed entirely for non-freetype builds. There is therefore only mono fonts for non-freetype builds. --- fonts/Arimo-LICENSE.txt | 202 ++++++++++++++++++++++++++++++++ fonts/Arimo-Regular.ttf | Bin 0 -> 436876 bytes fonts/Cousine-LICENSE.txt | 202 ++++++++++++++++++++++++++++++++ fonts/Cousine-Regular.ttf | Bin 0 -> 309040 bytes fonts/DroidSansFallbackFull.ttf | Bin 4529044 -> 0 bytes fonts/Tinos-LICENSE.txt | 202 ++++++++++++++++++++++++++++++++ fonts/Tinos-Regular.ttf | Bin 0 -> 475996 bytes fonts/liberationmono.ttf | Bin 333636 -> 0 bytes fonts/liberationsans.ttf | Bin 133828 -> 0 bytes fonts/lucida_sans_10.xml | Bin 156248 -> 0 bytes fonts/lucida_sans_100.png | Bin 12012 -> 0 bytes fonts/lucida_sans_11.xml | Bin 157272 -> 0 bytes fonts/lucida_sans_110.png | Bin 14739 -> 0 bytes fonts/lucida_sans_12.xml | Bin 157058 -> 0 bytes fonts/lucida_sans_120.png | Bin 16295 -> 0 bytes fonts/lucida_sans_14.xml | Bin 159272 -> 0 bytes fonts/lucida_sans_140.png | Bin 42429 -> 0 bytes fonts/lucida_sans_16.xml | Bin 160744 -> 0 bytes fonts/lucida_sans_160.png | Bin 48106 -> 0 bytes fonts/lucida_sans_18.xml | Bin 162284 -> 0 bytes fonts/lucida_sans_180.png | Bin 56766 -> 0 bytes fonts/lucida_sans_20.xml | Bin 162438 -> 0 bytes fonts/lucida_sans_200.png | Bin 69059 -> 0 bytes fonts/lucida_sans_22.xml | Bin 162936 -> 0 bytes fonts/lucida_sans_220.png | Bin 74427 -> 0 bytes fonts/lucida_sans_24.xml | Bin 166358 -> 0 bytes fonts/lucida_sans_240.png | Bin 83532 -> 0 bytes fonts/lucida_sans_26.xml | Bin 167054 -> 0 bytes fonts/lucida_sans_260.png | Bin 93958 -> 0 bytes fonts/lucida_sans_28.xml | Bin 167156 -> 0 bytes fonts/lucida_sans_280.png | Bin 101952 -> 0 bytes fonts/lucida_sans_36.xml | Bin 169606 -> 0 bytes fonts/lucida_sans_360.png | Bin 143453 -> 0 bytes fonts/lucida_sans_4.xml | Bin 136910 -> 0 bytes fonts/lucida_sans_40.png | Bin 7642 -> 0 bytes fonts/lucida_sans_48.xml | Bin 171972 -> 0 bytes fonts/lucida_sans_480.png | Bin 205578 -> 0 bytes fonts/lucida_sans_56.xml | Bin 174174 -> 0 bytes fonts/lucida_sans_560.png | Bin 246505 -> 0 bytes fonts/lucida_sans_6.xml | Bin 140552 -> 0 bytes fonts/lucida_sans_60.png | Bin 13992 -> 0 bytes fonts/lucida_sans_8.xml | Bin 154564 -> 0 bytes fonts/lucida_sans_80.png | Bin 9740 -> 0 bytes fonts/lucida_sans_9.xml | Bin 154830 -> 0 bytes fonts/lucida_sans_90.png | Bin 10704 -> 0 bytes src/defaultsettings.cpp | 8 +- 46 files changed, 610 insertions(+), 4 deletions(-) create mode 100644 fonts/Arimo-LICENSE.txt create mode 100644 fonts/Arimo-Regular.ttf create mode 100644 fonts/Cousine-LICENSE.txt create mode 100644 fonts/Cousine-Regular.ttf delete mode 100644 fonts/DroidSansFallbackFull.ttf create mode 100644 fonts/Tinos-LICENSE.txt create mode 100644 fonts/Tinos-Regular.ttf delete mode 100644 fonts/liberationmono.ttf delete mode 100644 fonts/liberationsans.ttf delete mode 100755 fonts/lucida_sans_10.xml delete mode 100755 fonts/lucida_sans_100.png delete mode 100755 fonts/lucida_sans_11.xml delete mode 100755 fonts/lucida_sans_110.png delete mode 100755 fonts/lucida_sans_12.xml delete mode 100755 fonts/lucida_sans_120.png delete mode 100755 fonts/lucida_sans_14.xml delete mode 100755 fonts/lucida_sans_140.png delete mode 100755 fonts/lucida_sans_16.xml delete mode 100755 fonts/lucida_sans_160.png delete mode 100755 fonts/lucida_sans_18.xml delete mode 100755 fonts/lucida_sans_180.png delete mode 100755 fonts/lucida_sans_20.xml delete mode 100755 fonts/lucida_sans_200.png delete mode 100755 fonts/lucida_sans_22.xml delete mode 100755 fonts/lucida_sans_220.png delete mode 100755 fonts/lucida_sans_24.xml delete mode 100755 fonts/lucida_sans_240.png delete mode 100755 fonts/lucida_sans_26.xml delete mode 100755 fonts/lucida_sans_260.png delete mode 100755 fonts/lucida_sans_28.xml delete mode 100755 fonts/lucida_sans_280.png delete mode 100755 fonts/lucida_sans_36.xml delete mode 100755 fonts/lucida_sans_360.png delete mode 100755 fonts/lucida_sans_4.xml delete mode 100755 fonts/lucida_sans_40.png delete mode 100755 fonts/lucida_sans_48.xml delete mode 100755 fonts/lucida_sans_480.png delete mode 100755 fonts/lucida_sans_56.xml delete mode 100755 fonts/lucida_sans_560.png delete mode 100755 fonts/lucida_sans_6.xml delete mode 100755 fonts/lucida_sans_60.png delete mode 100755 fonts/lucida_sans_8.xml delete mode 100755 fonts/lucida_sans_80.png delete mode 100755 fonts/lucida_sans_9.xml delete mode 100755 fonts/lucida_sans_90.png diff --git a/fonts/Arimo-LICENSE.txt b/fonts/Arimo-LICENSE.txt new file mode 100644 index 000000000..75b52484e --- /dev/null +++ b/fonts/Arimo-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/Arimo-Regular.ttf b/fonts/Arimo-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9be443c7df4832028061c8fcd2282ca61e45b27c GIT binary patch literal 436876 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 literal 0 HcmV?d00001 diff --git a/fonts/Cousine-LICENSE.txt b/fonts/Cousine-LICENSE.txt new file mode 100644 index 000000000..75b52484e --- /dev/null +++ b/fonts/Cousine-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/Cousine-Regular.ttf b/fonts/Cousine-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d6990a25e77e44d9c2cc8a331503b331f9baea2 GIT binary patch literal 309040 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

    2;vCR-|1g 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

    v(};DWegVHNZ{P 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 Bn-=3WI_Ih~* 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 M3VlF#{$^SJ9}|0{{r~^~ literal 0 HcmV?d00001 diff --git a/fonts/DroidSansFallbackFull.ttf b/fonts/DroidSansFallbackFull.ttf deleted file mode 100644 index a9df00585a4e44cf91238b7b31385e7e36e1dea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4529044 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¥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⪚cx~6afie1aM&FVyTjqNxWi$0IDCY2A^Cnf z0~mulyg#3%tY;hhI2MwvDfDItx#-YZ&PwWN;s7T@@`J8qGK@*g#vMLzhY#H019$jf zKPN)6tqZ*v#5iW6Lz@n5HR#ZGkW(S~p$;GF@S!_==nfz1@SzSL>hNJbyJ)8~B-_*I z&j@sApUWbuX`}^RKZ@y#t{;s@*N=4lXf+$zNgHQF@H4>Nbp6|5&V;1zEhT+#DS1@aqm$6#s1C=bgyeBukGtz}T~B!32|NA0 zf-1I#plGsgV41 zK5qZ1+n>?rjMtpe=ZrpQR#3}!WSo)lSr>XSh%roK9*bFnT|cwyXNS?F!wwyG?HI;* z@+e^$`gQ2nv6my93(3#Z8Gs!>x8vt_{M?S8ucQt;es0IJg)C$hcJh6nEIp;R#+~%Jt^kzs%o{#9mP{uKn`7EV| zE$pG4&XD|<+5a;8U%AYnm?c!RncX1{rBt$xMp`%;;{Vtc;x6mi#y*aP_$z^)WHXu> z6tjeCHY4*ZZJZ5p*Y0F7oQce0A**PhnN~VN{MA(Yk;8-#r}%SpnWAT+E13*tJb9F`jJ0fKFGn~R;wYT~jAU|%lOveKY!*GM2NRZ6WSvr*0eA!9h-iIJJ=$j&eT47i4fY#NE4xxQBgv3}7UB^eCX5mDJJ1 z0ZxWE&5mhyOdEzB)9jdL#|ynSeE~YB>zuB0`hHG?_#&Mz>cddRF_ZZ$rG{8_I zn_QAYZ-$V|49vR3tV_(g#LX^ovrF9UlJg<%mBBzpF`XhRs0#6=_3Yv>XF{AA)0bh4 zCl7bZT+K#ya)`4bzRY`YSr)_bo?hlXy=)M}8mqm&?Cg{^cW?OabMr3~}GZ ztii5*?b_F_eeHUMU9Yg~73N%F&K2fdVb?2`v6ijuXPu!nX! zLwsc#{Tabjim7BBjU3=)h_kw)LzWI%I%MgPRe}y#I%MgPwVx9q?(cQ|z3v-+{|&eJ zMlIVzJfM}15MPzb0NmgzH@M0Tt}16Gbu?k_Rpt&fcVH%i8OwD1?_yvDRW#6y?16Uw z&vaz}r|fL~v%Oc@M>!wjt1}qLs1OfwuR*$gvkSc##F!8dKFFyMe=CLF3?Y{p6tjeC zWPeNcw`6}y_7K@aWM8u#cNnU}&_%2c@wdl^cvu?yLhO4CagLn-Dhu&&H~a3E5Rcdy z;{TU}okzOCNH-X{E5zTM$gB{LS{LHcF=Lrd5fxO?Kr^i&{y`sxGLD(dXDQzIADHul zJ+#vq;xYP+>CXrzF`EUfpd-ZBrZN@z*UGrSaap??T4AYp$V%AX49@^;)@sHBTCYKo$vxI6kvzs=~ zhIo8;vKY=pW>Lm+*0U|dKOV|BW-_0p)UX9}e{AlL&7ENGg#L_R60=#vYBsWyL!1ur z^$~rLeZ6d-=f~H}zFzkAvagrz^ZeN7`SJC#C(52Ed!p=#vM0)(xPTSNo@l3ucA99X z8|-w0oo=wx4HL1`4R*T0PB+-;20Pubk7FU86zEAdqnXNF^q!>mB-xYno+Nvc?4QW~ z$w0<3ogylzqJd^w=?L-URQi#_1oA0o4fX8eFlR!1qy28Q-;MUW(SA4D??(IGXulh4 z+0K4Wgm_99dNGJGOk*C4sbLFyXvghtl6{lxn`GZ4`zF~p+3zO%-DJO;c5;Z*A)Xr1 zhoOvPCf=8+OOZWQ_EgzZWlxoTv)kS5b~le^Dsz#2v+SEUvzs=~hIm?cvKY=pX0Z^r zo91@Y+-{oNP3s8pPgChf4im_yluGJo!tH+QcGF|}GK}%qZ@Sw}cf09sH{I=~@8?8_ z|GNvl7{nN+F`uQ>u!TLe(;4C!ZZ{*F(M)A7i&%}@&2YOJZa2g2e&%*RbGx6p-Oudz zGyDB)A*7S>6 zp8k3I=gng=Yp7=zZj{Bal5u_8i%BWY3X3NA?`q zzHbp1bfFir3uG6_E|6WYob_yDAICy`N1!L!jAklxS;T5KvXevTU8r}V-i5LYWf#gW zlwGKIq27gh7wTQ8ccI>Q%Dz+fowDzoK`AS#qlp8Y4DsBqWHOksOs9wns%W5@Rysm_ zS1SF;VFLNczN?aTG}6LR&WCtj1_K$z6bf0$DmJi#gPaQS-6`~D2(s^%eYfnpW#29P zZrOLszFYR)vWsLF$u5#zB)dp`9VuJ_vYUVZM>=U#p8T}d5H9N=V#=XWKO!Hi`(MJ!`2TiMGI&V~5r z=?q{blPRDa**};4bJ;(a{d3tRvP)!_3}ZZblpwoAc8Tl~*(I{?>p~xfGLD(dXDKyo zV;{#tTpH*}HluNqQa34elTtS+-OO&oyOYHzrclU2s%W5@RysmlmP$Wzm`nlX ztfY=z9Og`jABgG82qrN*#0$(=V8#M77MQVM6&u*WLA<9AdQTtpo<2B)T=aiX{|EJd zu$o3%ILi4DmuD~#+2yj!WtYn?mt8KqTz0waa@oI-{R{nnv6_wSEi)AmCy?6}Mn8#w)P|q&(Uaa>o_5P*azjTvdx=BSU_OHlc z0{LuV5A7lT)w&QbnHb_q3GpgFTjgh~ z{A`t<{XU%mjASwel%wPD1=g zulu9dRhd&|PLY|pxW*neJ(2OGj3;G0DdWj8ObhYa@yrhK|4d~^h}W67 zt`xUl=RN!1LKbp}(;;3T(TAaoV zt$wxo)#_KPU+p{=<2|pf$4<3}ITPZiWBM`-dpw;-3Cmc^R`zm)b0Mzt9@GtBB$Fwi zoR!qk!~sr*_?fO`GMKSUr-%xwXrP%^Izqf5m44(ffqY7-WF3vPaFp{Q{=WeHm`cFX{i1884afk{K_V@sb%$W;B`6q<@qCP5L+K z-=u$&{!RKf>EEP(levG<|1bLgMgPC({}=uLQo=IUvX#9Y;arG!q%(k#Or`+YJ7n*W z{qh#}(2m>h)P1Ml?ex2y=I%6ir@60~`--`*nEQ&kubBIaxv!Y}in*_t`--`*nEQ&k zyGAexyZbCW_E~uBv+&qw;jz!cW1oe`uiE`pyT5ApSMC0)-Cwo)tNOjFgU`a_S9N<; zH=l*aJ`0bVvl-0{idjN6n`z-F=R^Ej1_K$z6bh-JiiQyH_RMb2?Dov=lOcY+E13*t zE{j;r#t`pGX8=p7L9ab}?a^ybXNccOqd#_j!_IHCaW=$z%R~HT3cVRZE_%PI_nUgZ zsY8orTRhuRA7Y;`$39<zkj!j!<-56zL>tWaFp{Qek%j}zBLNB z-Cx2o*0Pno9N}Du-%iJ@x6OLnthdd2+pM=&Qb!X9aF+w_a=={<3}!6TDWZZZ8fd1K zju5|-N^8I8%x*Kg&Fl|T>4zJ9xEDA0&<)ykYS*b< zr*@s%b!ykCU8i=P+I4Ezsa>a!boxjqpXJ6MO=T{NSdDHz%Z)!e#OV+piRi;n#xavJ zRFKOQAP8Ody|9Dp^Nkh>tGBvqwF9)U!uDd(^WZd-h|`emsO+W>Cx$s@WXk zWA1Rw9gexfad$ZG4#&+pZq{+Lj+=Gdtm9@KH_PY2@$r)(K2eCdC(Ql3fBya7|1{rc z!tp2m{)xYT^6$Uvb7~$-sbNcq|KWcBaKC>vaR7OzyOPOZ#$x8DUFgLi#xM<8pDtz% z_3Yv>XF_}?rZ3)uGvmplgk`K{D|@Q`1Df>&=U&{Vc_Ls81l>MdbbFzJg9s3MB_8E43PWCz3 z=Vbc~J3hCAgPaPn&#+^kVaGnhj{lj<42oGoHJjN@8)rj&zB^eAXCkwZeO~r?+2>`S zmwjILzhwVQ_P_l7U#CL1kV0>UFoAqZsbn3Ev~ZO3q1%6CFpyD9p^$~FVgoxki0m%1 zyU6Y$yGt%JC}s)OY-TrYoDJQ+(w!`ZGm%-y{)+6c$o`7#ugLz2?5?uA%J$!&=+;$s zSJ_=-jODCn8~ZpGx}^kq;`tQMr+7Z$ z`Gn^ao=@02Vef=)i7Fasrj?G+ElQ;yIZPm*a#m7D6Nfnyx+P=!GlEIXW&taxWjlvB z9lFI4eHh9(W-_0p*dgA=K8}TM-2y$yW;9co%Oa}T%x>DSUup&e8O0QeLbnUnP|q&( zz2Hpf);*>#!x&EUT+~iy=$4U&XET~grn7*RtY-%;ba64nvXU5#c9wRQc9wRQ-C1^L*_~x~mfbhmeUsfc z*?p7UH`#rY-8b2NlifGjeUsfc*?p7UL+u)B*HF8L*)`0rVRj9(YnWZb>>6g*FuR7? zHO#JIb`7&D+pcW8vhB*YE8DJYyRz-dwkzANY`e1Uy4kLq?Yh~no9(*UuAA+;*{+-I zy4kLq?Yh~no9!ANk;X_SFq1`8v4LhBeX|okI){WJwkhg_6Y3}duZoOh>h&c0J6zvD)U%Q z9oslSC*2`-O9F!!#YASYm{n{-`xfn6>>g$JD7#15J*tor%BiM--5ln0h<&>kDGX&C z#gv8EXy+R3T%(=qR_D6a?{D?{TmAl4zrVGTwKU<*Zgpq3dUmd7=ME;9Da>UVwQOY{ z$3yHp+iBxWh<&#&1Ib}L(^et`wl<5!_V&Uvpf9kj(_~j zo_u@q?a8+%-=2JD&UfZ~XU?}R-?n_)@@>o4{+{Q5&-1^xj_n-8eSGgih!rG~&S)kv z8_zB9+yc)n@Z18=E%4ksJ@-z}z0-5=^xQi=_fF5f({u0i+&ew@PS3s5bMN%r@qKa5 z@i{o>_~|TQCF|Ki3te0cvAdEOOfH3#P);=s?B+11Lu^7XQW(lOiYcR#wKSnUL3@Js z-P(6+->rSO-FMr4x7~NUle^u?-R|UWcXIcI5Sy4tI-{Ay9F|hU7WQ(4vmy5VJ`7?M z6Pd+gRJf<+0 z6>MTBZJZ3Te+~2}lYFK!kLA>{jaE)@Da0oCBZDy%QHt|TwqddjlWmx6!($V$*vu zkQ~M{n3V1Ln`iUhC7?#&Sto?8SZSxCidXYW}FW(?_w|r;^}*p3Fpc@FU|opKcJ?3Z{Wyi8jH8$`^nUE@Ki2#4A@oZ0O7u$fN}RpK z*-MCFJL$!99_aHgNs;Y>eqrk`}u9b%;k48pyZYL{x4YL{x4 zYM1V$jgukvP@q4VxUYxY*F)M5X+N}qW?DJHr4XCbkBkuWjzr8m60x89-P|!0QA!1C zXv7)36A|-HMC@T_c-R>pc7}(Y;bCWZ*mEBCoQIv^VP|;Q86I|qhn=C!8OofY%o)m@ z!8;K#??lAB6A|-HM667^OxrsVG4Djgyb}?7MEenK??l8N(e_S6%sUaWd2?7w4O>F& zXT_9J$y%C1%sURT`72q^4qE8qVu<}biNWMjND1ZCvXy;wa4y6a^kpD9jAuFv(Dsf) z%sUP-?>NL3XfM!SsJ&2oq4q-Uh1v_3p}kOh;X#gbA;cCXlFn!*F`Ff~tKc>A@d#UzP?WNjFwU=ry zT}eH=IK-(C`*-*G@6P=1!zo}I^I5?|SN}D!W(Ny~^%Y+N-ozX|K|LQu|5mC$*o{e$wtI?S9hk zC+&XH?kDYj((WhiUTybkyH{(k)?Tf>T6?wjYVFn9tF>2aKc)SY_EXwVX+Nd?l=f40 zKV|n*c0XnJQ+7XPceUNsc2{dxYgcPmYgcPmYgcPmYgcP~za;jw_R}LNq=a&+*~&gT zI2U4T`jXCQCNY~Otfrn_9O6`n{jLYeWKqC0=CguL?4%7FYHX;np~m@Y@|ns!mQ%+z z4&d%;xgmS8BU^j<37h?afF9R9PBxbXO)zq_#L%6#- zcUR}`>V{LmH0I;(>ejKHHcp1vbAkS3GM35AVJS6iVJ}BG8)EC+-8y%-&fTq>$SfAK zicRdHoiic!AH5mCNG4E1InMVV&i5bt=-@(#txqH!=UeZ5-uH>EcfR#Dtlvf}C%6=1 z|JjcW#!y5Vm8_+S{T$8=YsP^K2Z2^K5jUjn1>tc{Xlh zC+=#ayV~TgHuc9{ZE{ze+|{NzEXB@ETiDAH&W70U`;f|T3Yf-xw12Ptd+pzA|6aRZ zyI#9qyI#9qyI#9qyI#9qyI#9qyI%Ww?dP?h*M466dApyt`+4o>wV&61Uiw`hB(DCV7_ zn0Ja|-YJT0vD-UEu`SIU4zU;a)5XOQ+nU5+aw(*Qa;j-yH@>s=bcp?-7by&79L1DT z$y%Dw{=+fOhgefY8rn_TP1;S`P1;Rc*+&N#LhPkP+`~)m;U)L*l6!c`J-p-|UOF3M z+xn2oa0-~ld{)uO9@;q*VlVe*03(^eOcqha2AV@`yDi)6xD;ZqtU==yjaM{Y(b%D} zLt{ra`AlUV%kjM(+c-cc-68hJ1O_pRiOga#_Wf}aJ89!&h&5|BYd32*+t+MMvwLZF zFRyOrAjd;&XP`fsjAb%&LhLo&*KB^RF~oNH8~xWV4sj~PcDtwDcI>ue_u3G9-Lqa_ z&kkBbY>(&c@ti%rx5wXh&tXo7*q=21q_MXi|9$U2{=43vdyq^P$2cEi`y$d9$pmJy z2=}{h1I;1!MhE9YY=2({lEZkWvw)Q$_T~}JhM4zbV*fpqaTHTVCHDV!6Z=E#pgTHP zPBpe4wEdv%2W@|=7aDJAyruD$##`_V(5gYxVtBch|au7P`0?V(%m|m|P06?H$|RvF#n(-m&c++upIQ&9*k% z+H7mHtNU;(6Yyi5*_Y_7HpDruIz6QpYw9&`EcQeUQLBmgDyy`27cd|AF6s;P*%T{>UIk zF_Bp;W)+**NgF3a>}a4ro_ExqqxKxtKB|3G`>6I&?W5X9wL7#sv^%sr*3ifv+Bp+q zANFPd+304#z-bGlSNeF z@8sWq5IcUD(;@ahy+~mw<0xhUtEp!fhd3KzU42MpI0Z}#vA-;%maQRnA|229WDuk9 zj88n{r1PD0zLU;(()m91nNMx`)Rs?e`P4Z-bjXJxC^tJf<+0Ww^g{Hl4HS zoK5F!`og9!Z2H2cFD5aYC9I~NU1)!yeO~*#_WAQ6_GLsGBk}xh8@p}nwy}FYHg?rzVf^ao_E3XE@)rSzEDa9YiMK- z?VJg*zxHMT+2k{oc_DUjY>54B5TlsLEEcm0jlXI9P2+DGmozSET++CtaY^ISBC6Ox zGp(H9Qi%P%9~q3H2>bqS-{0-~yY}C;y`vKIj!G1IGk|RJnaVttQ^&Rt{ga>llb`)l z6&q-#l@nYFQICFPFoq&ZsbCF_?4cdc>*;wtJ+G(d_4K@++C8;*;wt570?> zhTMCU(-s$q@Z>pg)<6WioSEN)21s%Ms3osCOSy8BPJyn9mB?EYFSC%6=%J}C@k9L1EelJ)GMg;OEAtOv?pXuAh#Sq1k7)&mOA&SN`odx(#c8YsQSreiwdtl?0HePAtfaxK+Dvc8%N?jYGt7nI3pzgqCoOhs~U(*nxG~Y`r zql=3nx;BZyz+dX(E&NJ9~Zg8F(oaY8V zzhNwsnZr_Q*n%_M;0!mM4N-<|8L14XfN3~S#tPQq&NJM3hC9!2=R@52kaR{fiP5Q4lWRZva&z#FLYT3#@Iye`i8~ZYl9L6)91*~K}J7~e3-RRD;lF-i5 z&eG1(&eG1(&eG1(&eG1(zDfHg?VGf3(!NRiCheP!g=pwx=CCwG!+dU-&kgfA?@2`7 zlZd=05e;h#QFcTcBbmTV7E#3pnrY<(mqK)NKQb7@8XDO{J7+>Pyf*{LCZDOyV|j?a zZXoPc&aE=kqF~T`UIL8R* z7~vcvoMVJ@jBt(-&N0F{Mmonx=NRc6Ba1?Gi@UkS-Q41CZdt%;>ekXn#lhJKEpT{*Lw-?J?S8w8s?C$_Xxo=)3*MU<^f+v6A)dpoK0jhG=XO zgUO|k672I{MKspEjy;Hb9qV3ibN1Vu{WfR6Z4%CY+fr)S!d^P*4pCkLgRmjbhP=`c z-R`@$kHwj9cjnujd0Z3w>B62n?7739JM6i`o;&Qhqnv6Q@ZCFnH-7?tm+yD^ewXie z`MdeY?{vS{mx1Ikp6M*WJ$$boTfcXNvmq+zgRKRln8++DSc829`?1eE7tx)m45t8} zyK^zC*u+lSITNDsy%|6@wvI2s*73D$#W}{?I^MnB#MU zC%D%M8H}SCXPV$l6V|hfBlz6iK6ke>-R(?wJJa2>Sd6WA+j_UHceimeL=yx3$z&{( znZr`**hVWSxD=xA_rr$okD-WC+}HQl;J&`UpJSX4(WHnpMlyjCmQjm)nB*QNxrZP4 z=O6gz9~|U3?xoPC!ff)H$~=~{fo5zfw5iahdu+PLrh9C<$3GYO=c1vwr=nuYsKh-L z?cxxpLiDdaNG6K{rm>h+Y+@&EoD9+AfK8L#(`5HF**#5mPm^t$T*o#J&`EcQewcv2 z!4Lfne&}!TLw|!GYX4CChmGu^oiibt(whOerzsPd$s($7-YL5|%;^yQs23?X-;bQ{ zN6z=71*~K}J7}Sciy7)ZW-OHJf~F zn`+zCY8tR@s%=wkyU(`!Y`f34`)s?-Q-(h+)t(*wa40~qSGb4xbOvj!X_RO$n zhP#^KIWxMr7^0c(YNkCi^O(Y1mQl-A_R+z)5IxYBfsAGnHauX%12t^p0G)J)XjTG) z7)24KIP0u6G_oHXX4&wd4G#_`mqJP?$A$-Oc+iFiZFtaz**46!VYc(lwqf>cmav+7 zc5#HWA^LG2Z1}MaC25RAzeK-8zeK-8zeK-8zvM!Qev*iL{>fM-A9BwR+3=7J583dL4G*0Q z(Hv)-lg?-+h3Kcg`%~Zjsqg-D3cmZ(6|7@B2RV-YbNiD`K2upl6&u)%XUz4ChZFIP zhsWZa4?E|>&iQZ+TiDAHoU^PS8H~Z-()$-tnRAw{p@|kwh3JtUB$GuRwmvc+TOV1+ zc5Hpb)<OX@i^Z?=UeD}3+u6Ap$!XdSmb<*oNtlyEwW)zDV40Hi59xJ7@~hm zB8xnxFqdW2vXz6l2k&x3-sOlEyNAX3Ol2O+*+4U`oZwQ3e$kH%#!<`yR%7cg_R>jr zh?e-=5}#W#h9YcTV(SuHmo#DPk}hohWirDlU>fsT!8*2M>n~4+sNB}_0gR-O63VHj z0ry(o!MPAU+LwVi)1%Jx=scEF$2JaN>!Y?-B;apb;cr`EYlW>96|A8Vf7^;#vf@B9CdzX9c$YYC8ux&V>+FCX&u* zCNY~O*idOhr45ybI2EE__dxsC+P~KRwf}wnTKm_l*o1rdbvtK5w7fTIjAQ~cSws~Z za1YDf!}1e2-{a2rcm`uAqLd2O(8wONSM266r$h9cUZgOTaZG0cD_PGDTIj;PtW07s zxfC*&Wz@2jeH`aPh<=+$I_~ASlbM6R;cx5M#sNC%4pCJCgBXSFRkl~zUbU7c_Hzsy zp0MEw8=kP?2^*d$p`2elgT2FDa>UV>)6gg+~n8?`rTZ`9tXy-|Ck z_D1cE+8ebuYH!r`?}CXoX>S_D7>X#x-EDGro7~-|{T$CC^V-jAKRq~T^z#Q zc~>Lyu12(_KbeeWGILl;4O`gD5xPU<-|G^+n1S6d+Wn&Ti`p-0zi9W1c6(PN@~%d- z)o$-5OI)vsuDw>aqI|cK_j2h?;tkOcr@)H)%I% zH`Suuq}`;a_ZQ| z0kmJy-l4rid&fA6DWj6LG_jv!oDb0-Bhna&-G8+Ek9Pmj?myc7N4x)M_aC+YsNJmH ztleyPv)#>hH{0E8ceCBib~oGIZ1<~nziRiZcE4)(t9HL?_p5flYWJ&lziRiZopgt2 zX99y5#YASY810?fJGFOe@6>)x`!(&?v|rPHP5U+N*R)^Leogx|?bozl)Bdk?Ml*@o zEMYbE?BWooLbSUFsSKxpY0PH@>)6ggj&mVIuP37Yy7ueZuWP@q{krz++OKQBuKl|9 z9_>9ov&U!l_{<)k+2b>Nd}fc&?D3gD`OKe^$qLclB1)-bJwCVh2+s58ehg(idVgL@ z9nBo(T!{ABwl9->W>QWq&akg7L~rQ7v6FxN_md&oA6UgE{CvNk@AvaJ{rt`TXuUa> z$;`ns->hK^d+Efs0|{g>2G2O)3Aw$h9QS(A_Ji*ApnE;& z&JKFsLC-trc?Ui3pywTQ7YEOV=&e4aGMoaYq5YQjTiS1Fzoq?_c8jyLI7^GOw2Wmk z+AZ2G+AZ2G+AZ2G+HY&Wt^Kz4+uCnyzr7gu^tO9?+daMA&Y2Lk_GSRtq~9kkHJ#Spb6F_>HmDWRNd8raQYPKW4S?RT}`9m+V0DMR~R z?RT}`J;bRH9qNJe9U8?%X0e!6INu@XJJiO>5WVN_-g9^Fxx4q=-FxotJ$Lusa_ZQ| zfe;28XvXy;wa4tmceHlm&<8d$T?xlS-TiDAH zxAwuKd}9ScFu(8NN>^@$pmaT;{J|Q)4*;Hb2>yv-QQ6g zj@oe4hNH7tN)0v~ZRJFWI()7pg`teY)(%@cZ0)GW)(%@cZ2i#I4{iO>)(>s{(AEzt zSVJRwIL7%99dlpD29w7W=CTa;bQWbr<``qgs7`G1IR|dOTSCMtBMWi|HYa9GM?!;(_dDyo*lH%#l;Yva9<|| zlS?5bc-9G9PuO}w>x8W*Z2iR6Pi+0f)=zBx#MV!2{lwN!Z2iR6Pxf<+^C3DJk%sn3 z?UULkwNGlF)IO0X1Ln^~5U>fsT!MYHg_OsJ|cG}NQ``PJ#{A@c1InIR;eU?Z%p7)vOedc+edERH9 z_nGH?=6RnT;#7#v^dOlm@|eP0mQl-A_R+z)5Pja4fjH~u&ic8te(tQFJL~7p`nj`y z?yR5t8-0E;L}!y2%uHySwe~w!7QzZo9kf?zX$z?ryug?e4a_+wQOI{%Qc(Og7yXN3)&a7FKA!TzM$=0tH`@nk$0`43)lEZkWvw)SX zX9q2GaWO=HPhv2+As%`&fRRjKCX1+I1G_oQ=@9>?UZgOT@l0m{D_PGDTIk|pi1$ch zFrL$+kP^zNrUC69+C8*;YWLLcsoirN#gtLWTAJ9;G0um0uL$j4+P$=UY4_6ZrQJ)r zmv%4hUfTbx{m+_hAr&n2xmk5Ykf#%I0Z~&J}X$qb`El!3nAVo zk#t5giPUGLRg`Go1yjWIa1*p^J+l z9!tU<#oUqiwBj*$6f38i26l6p(;*)9A_eWp?#S-Q?#S-Q?#S-QokV9tJl=;?hEu>a z=HpJ{o7hPkCqq0T(4S1kGMRZSr;cqLpp)(p|Ca;?F^VEesbCF_?4h0WA)e@biO!ek ze2G(VcZu#U(cL9($A&~3zHYI-1#oo?w7()#!*Zem8_)+ zf4_eIe*G?n_&1!de?%H1Da0AS>3iSwy>I&7H+}D$zW2@j9OHb5C;MLVU~=)DyafnkPp3;M4vdF`or`VI?&QogH%07;V_?3Y%6j4eA z?(a(XccuHg(*0d|Cd3E0zX1ctCZDOyV>xwf;{cs>hxkZJZ48fzCIu zKbeeWGILl;4O`gD5zdDAHGN2BI0Z~&J}X$qb`El!3n8ACNIIjLgm#*Cns%CYns%CY zn)bEY*J@v@eXaJj+Sh7dt9`BZwc6KeU#oqs_8{#++Jm$QX%Cvs5>`{sE)H=j#INf? zGFjv?g}E%FmaXig1MPI}bnSHQbnSHQbi32-PPaSV?sU7;?Y`db>+QbY?(6No-tOz| zzTWQZ?Y`db>+QbY?!kcpWRuSx+Bp;AH}uBuZt%Ms{O*RS%wsuqY~ui(bcc9GAtjVk zO+$zearPn3K4cfpKE&BGojudpGo3xt*)yH}MnAi;g)T0JcvcdF$wfCyH%m85H%s@X zwKTDxW1J81p%H0}WCAl;L=_uorj-+13h`n6$Y2ablu{Am*~2Md8uMAfI^0{fd&_oj z*%w0m=0wsN%_L^Cgw@oui$k0W@!`%l+?j_v^KfS#?##pIvW!}`vX2hVh4{DnGLRg` zqnG3RIliB>o5LYK!ZSyB<_OOm;h7_RW`t*s@XQgOInpyn`p!t-8M!yaZ&^wWTlmL6 z9|`eM>)AmIU0e+DZznOBTnZ_noN5~I{BL{yw@-)o=w75SlyMYOMkQ-$Vn4??AL6%0 zq%o2S%w!Q&Y@nG|PH-v2bNi9O7|w?HclwaZa0<{Iqd7)%jOG~4F`8pEzw0|=(;3Yq zX0wFV)UykBHP&6-=B{pYSGOJHI2S@ZFA?9*^Zh*E&-48}-_P^?Jm1gr{XE~#^Zna> z|90QMJ&Qc1FqdW2vXy;wa4y8h^<^MAjAuFvSjl>{$7zq#zC-(t$?OR6{E;|gzBA@K zW4?RKcW?RbEx(o1A^yEyq%f3m6jMfJh!;3dfzK73;8KX+*^dmiu$Lorhxqt5&V=|~ zy%~V#-sQP>dG1}Fdsj6L?B+0@JHc}&cpG+2cOkqANSjTn_a-0hxJ}HrOMl*@ooDcCIM5JNo5A6Jboj zc5lV*t#~NoD5i``*3!g&j&VN3?~O=fBolCN_qw-xtJpv@t(@Reh)?ZD24g6qlnU0+ zh(uZK>LAe8raQYPKWrcUZkKsOM8~~EbUp^v$SVvd;cvyOM8~~gW3;jKdAkn_Ji6F zYCmZAgLXe?_k(snX!nD5&$fHEJDKfHW*1RP1#4(z5AB=@@gMhQ0NLa-m3e6Y*zOC3ctOFp1eLVKw#a;t;1o{3ks~CW}0#FqdVlV><^q&V>*!O(dPsXqRf2 zE~Sob9KiWXo$n#%d&v17a=wS0@1e2~pHsj&VN3e;ScSE`^j(PBqT=Q|J4s z^ZoQ(h|jfQt_^c-m}|pa8|FIS+#0rE!`x1~L;T?c1~H0>%wlnfm-Qlrp^T##`^r|b zo*lH%#l;YRB#FV;_lSLu*!PHikJ$H!eUI4ph<%To4)J-~^R(w_&(of#Jx_a{v(Iz( zpCyvcXm)XkQz1UT2gziS#}wwWj9Rv`j}F|!&-*fv9L6)91vtaco#E%s@N;MQxikFS z85TIh0%usDy+C_`_5$q%+6%N7XfM!SpuJFgq4q-Uh1v_X7iurmUZ}lLd!hD1?SCFJL$!99_SWX?=I6x=e zA^yt*1~H0>%wlnfm-}A1@0I&rx$l+xUb*j;`(C;4J?eXp`rf0y_o(kZYSW`OJ!;dV zHa%+7qc%NiQ-w_xHdWYEVN->6g?5E@g?5GWRvhMZh(Feg6oxX6V%+6p?((s!Q=xh$iWt?Z+Nb0NO0F9XS8JkwdgO4hT37P`0? z;=f8_Fu4>`LOInmup4Llm9tekTcxvAI$Nc)RXSUxcBOWumUr3Wzuv@7+CqGJ8I`Q1 ziTxbIXCHT_$A>eKS-AVheeQ9ed)&UqoqdI~ukg7QCqw)+_ zhAr&n2xmilRUcAuu2lt0!`@XZSjTn_a-0hx{$wKQjAjzES;A`S*~KB8d$qe*?Jibl zk;fF~vW!}`vMr!?WeV$J{#g|`r!O)oPUk;uW|l0+H17e zXs_8x8z)2jcY*$7GM35AVJS7Z+uym{-?`i0Y1e4iXxC`hXxC`hXxC`hXxG?XV|R_+ zHFiH^_cL}sWA`(5KV$bZc0XhHGj=~?_cL}sb1KAZd*DuL-AS!GsdXo{?zYz5*1Fr; zt?Z+Nb0Pk0Uj~xHc&4*}m8@q6Ep%})#MdSAsgLZ>< zgLZ@64R$x!-Ec0%H}}PzY<4G`$1|M;xRcH9WV1Wj>`peH3h~AsB$GuRQ<%##YT3#@ zI?#SW`vvV6v|rGELHh;m7qnl{enI;M?H9VZ7~)%!7)&mOlu%AJc5ktJi``pJhxm)V zNMR`M%7E#3pnrY=kh`+4;vi8f`FKfT7{j&DU+AnLrto^d~%i1q% zZ`aqnU(tR=`xWh1v|rKQp}j+U zhxQKb9VL`gO#|*^M+fIZ{EvMZNDkwf&H`4lo*lH%#l;YBPGT^*6r$a%-K^cL-K^bw znA0KtsylhroxJK!UUet0x|3Jk$*Xq1YWJ&lzm`lEc}!t0XG45fA5s}k0n^a_FB|{M z#{bgat-pI|h`(;r>o&b^)9W_9Zqw^Fy>8R%Hofk9uiLbzhAr&n2%hsN&-s(*{K<3v z~})yWg<; z4ZGj4`whGI+r8iJ{dVuSd%xZL?cQ(qe(n9*`?dFLziIcIcE4%&n|8lx_nUUVY4@9U zziIcIcE4%&n|2?t`+(gC>^@-k0lN>_eZcMm>)AmIU0e+D|4w2sxfD`DIn^|&s?dH*`z`Iav|F@Wv|F@Wv|F@Wv|F@W zv|F@Wv|F@WwBOc#Tl;P8x3%Baep~x(?YB43Oe@;0+O68H+O68H+O68H+O68H+O68H z+O68}XuqTVj`lm+?`XfH{f_oK+V9x?j@|EQw`sR&w`sR&w`sR&w`sR&w`sR&w`sR& zzpMSO_PeJ-gqt`#rngv->@F@}4_+?*x}Z{BS=q7()@IRIr9d_R!9m5Px6$eeL(P-`9R$ z`+e>Awcpo%U;BOS_qE&YZnwML?smJ|?QXZb-R^d~+wE?*yWQ?~yFbwWK>Gvj541mU zCm*5SV zwU25a)jq0yRQsrQhjxc{hjxc{hjxc{hjxc{hjxc{hjxedhuR-%f2jST_J`UZYJaHx zq4tN`A9ipq#ER$Bkt~hj&U)>yOOY>%Z4r+x@_pOq09NYoX>l9 z@h<1Wj||38Oc|A|rHTD?aWTaIH;KXIQb-BqxV!&tU^jp_nEu<%-wzF?mk?VJhmGrbu=Hu+3t9?NmQ zGut>oC*2|bc>;qN#YASYm{n{-`|~zVhWOclyE~i7ShUY-pRHm8&9riYOCkP${m5Vp zMU+y(8XDPy-T!w!#Lq>fF_Hl*+&QGLi~%qq%)dH%w{Rh_r*4x?+fSq!uifS z-+3F(+i<>^GAdci4qE66@h^LjOcw6=%PGud8MWB(r43)&@TCpiiMWUEu}sB1bT7w- zZX3F7=(eHThOcb+${l~@j=!47EEcnhO}K}z+{0IALi|E+29QlY+84AhXkXC2pnXC6 z!U-;g_+R_se1CPmzZOwS1#4(T`>)!6)xH>!#z-bGlSNd~z-|t6I>i6hixh@34tMuA zclWnS*3!g&j&VN3FKJ)W{=577yZidP`}+GnIye^+LSF`w!+55%fR(Ig2Q74QF(mv` z5?K^5jrpu#T}bHBgJk@^M;=p{%Q9-&%04>q?4F+8)3bYec2Cdl>DfI!yQgRO^z5FV z-P5ysdUj9G?&aCN29rx6C6rT51G_oQ>5$;Pyaey%CH(VH#!*Zem8_+S{T$%_tEa7-AB8R zb|3A_v@f&!GP^Ic`!c&Pv->i;FSGkHyDzi*vWp?1ZxVyar4V=0*PZlrCw<*XUw6{i zo%D4lF?SMkCo%1qc1$~_9n+4jX9q2Gp&e;Q+L3mo9cf3)sAVhr=-^yPi1%e6IgDpI z3s{METsy8EKNS)Z`jE)AmIU0e(a-%Mf|zMJgK$@ri_Cj;R-*y!q2Yovn%}U3ioh@d$__qT;U$Ba1U3whZOga;vQ1mL&^l)LyCJy zsbT}Rrr4U|9#Y)HmG0q6_i&|qxY9jb=^n0h4_CT}D;seSSGtEQ&xC{ly%|6@?!o(g z2?N~20QWGUj%^&ElkSjkRRV(;#YASYm{n|ICv9k_YNu+aYJ0yg!TWs)-tS9D)lSt; z)lSt;)%Jd0!qwVWYhSH>wf5E8S8HFbeYN)0+E;5|eKI5r4D=_Hu}o$TOQ~TC+5@!* zYG0#$jrKL#*Jxj(eU0`t+Sh1bqkWC`HQH&~Y1(NsSws~ZXr`4DTnY)-_9KHa6j4eA zYiMK-?VJe-gWSa+cQMFa400EP+{GYwG00sEau+HSG-s|kW&fe?n zz0Th2?7hz3>+HSG-s|j5w>RD1ba#>NF4Emay1PhUN)21s8xpS9yS{{Ss%c<1hdCV* z2KOR`p^T%LGAdb16Z<*F`H*l!L>eQRz)TiV#RlBh4esj(_jQB&%5Yy98H}NbQYu(O zBib3-8QMd%hiDJc9-=)&dx-WB?IGGjw1;R9(H^3mshz2vshz2vshz2vshz2vxrcVn zgoGQlZ`8g~`$p{>wQtnEQTs;i8?|rLzES%|?JVsq?JVsq?JVsq?JVsq?JVsq?JVt^ zdNY7*@|ns!mQ%+z4$w(=NEn*HAVx8fSuAE1o7hPkCqu%pKz}mP9;Q7^dzkhx?P1!( zw1;UA)6Uk;*3Q<>*3Q<>*3Py&+wN?;v+d5d`)0duw)&N!K~OjUzkHsXsqtoNyqOwrUW(PoMHzNtKe{n2PgD@djv_mX>?pFM z$c`dAitMNcbYMuHTLLiwGr`ZmEeW8%TS`%jCiH+gMblq2{YB40B$7aX(exKhf6?`5 z!wGqA9fR=*#X`g(4S6WXF0_E`Tgi?gJBI8SvSY}OAv=bg#pEm|XE8a8$yrR!VsaLf zvzVO4Kn2#l( zkGtsOu1(m1W^`dlo`gV5z)XZA0qIze&Detj=*4MymYJ9WvX_y)jO=C9y^Ok-QTHb{%0 z?`9@`byV$<8D@lioAwJ(J!aruT>G{b71v8-lrr z!D{593_GzO-58eVks#3DBVmX@A~H~bO4Q*Xj$uTeEE{BJk)1_$RtmCFf*Le}>@2b$ zCHqlof0WuErS?au{n2%(z;3kSC{D?fZD2BHBMQk_iy~BGFWS*B&ts!77Sk{vORx%L zKeh=wK=xx~KSp*A**RqAkex$z4%s_t2J+_V7T}t+IWIsptb7Vh9_H$%EM>hBMdAP67!+m`o?(6eBN8OvKdlPkUqV7%9 zy=e(nVI4MM2b$4^A$hp3&%=Fv9`5V&JRc6SpC|iyvY#jWd9t4;`+2g<$SxzhjO;S9 z%g8PxyNv8IvdhRWBfE_3GO}MF`vtOJAo~TfUm*JhvR@$k1+rftyWGSS%t16(APdFV ziUxFGK%N&zgS;2Xdy%{s6OfMe*o-|mfL@%IhkN-v6=YYCT|ssQ*%f5J6p18cq7YT6 zM;rR&*(^Aiig}1dDsoVYS~Q^tBl5g#BLs61gA`<=1T|=2gkODw$Vh zGrBM&&ntnTzgOt*75aOH{$8QKSLp8*`g?``UO52z;~qUv75#CKo`-w%JXQ2pMSoTF zS5=IyXaLz&WN#sR3)x%9-a_^kvbT`Eh3qY4Zy|dN*;~loLUuLT)nr$bT}^g1+0|rM zpOWWQ>VK8`U#0$6TX7T|-&%&9*pF@u%kx?gCL#DJm#4(J>Q)43pa}k3S zWP@4O)SwY$*O0x9>}_OkBYPX!+sNKV_BOJ&k-d%VZDemFdmGucWY>~iOLi^UwPe?l zT}yT?*|lWXl3h#ocCxpVy`AjsWN#;XJK5XG-cI&*vbU4HeL$WaftY}q2uA|au^yY{ zc|8;h5r;J7p&Yx=f*zcdXQxM=U5-3&9+hYJYUF~M?q;UD_k-GYQ`=kA_7=6hMQwWm z5R4gEgm|n$J}R&qtswJlf&90pVjg0ViX4=p7EL&UL3!%Pt|PmS>^idR$gU&1j_h|L zkO*e-4l{X&nY_bH-eD&19K(n_^){ws0hWTE>glPTp6cnTo}TLIsh*zRrKfl4>0Nqy zm+W`RewXZb$$ppYcgcR2?03n2m+ZY{?+w9R#2^LPC_xPx(TNlCyf+5p5sHO~LmKi> zj$LR$4^GO{-~rhUWH*rAKz0M!4P-Y^cLQ}dPNOAz)TvMNh339WG0Qwq>-64lHEvlBiW6o<@vzGG|a~mtin2M zlBbE>CUTp|-AC>|a`%zDkKBFa?jv^}x%=v?H$ZjF~W3oRc`(v^{UWhoPArIx)g@ZVT5qVl|P;V=#-SoZ~(nHEzhT8 zF$0Sbk2T0g1$LtqM{!D?g9avp*&U1pvpdM_4wj=1^mmXN4vhxy$07PVM1P0q?-2bR zqQ67*cZmKDQNtl>I7AI?Cg`t?{@UoTjsDu`uZ{lN=&z0b+B!h?VX_aCeVFXSWFIE` zFxiL6K1}vuvJdY^H-_bD55h!*Ap(iWKmjU2-R;!fehee>d}bpAa}k3SWTON%XhbJY z$kQGuO{6up6!T8Eju@DX*@!|i)}jct zXu=T;%JW44f-wWUXJ3&01=(Ma{RP=y)T0f3@^lFfrpogrk6-@rI1jN%MIOqr3(Vk4 zX7D95=w=4p%%FQNVvqu6(9I0GnL#%*=w=4p%-}0#@D(%oiWz*h5OGKY*|4 zpa&=A>G5C^W+4(u$OPFvWcQHWLv|0@Uz7bc*bmD|Oebn7Y-F?*EN8NqY-ACPh)ZItjebn7Y-F?*EN8QKC zK2G*=vX7H}ob2OdA1C`bbswkhDI1y8EfSpSt_0 zyPvwh4?r+xU=iX$_V;9ePxkj@e^2)JWDk%%K-~k>JwV+9)IE@a0#u?72XPD|^88>U z1alFC6l9|W%;X1V!u?{NAD9XEi+Q+T%)|X+9_|lr?4raprVxAMs`2nOZ(DFDHkfkhzuC$fJc`zNx0BKs$@e>;v;$Q~kli0mP< zhsYixdx-2IvWLhXBKv3R{+YUertY7q`)9I$Ci`cye|wHp z$sQ(qnCxM)hsho$dzkEDvVS4_7qWjL`xml*A^R7ye;NM!jQaw3d97=Mii2<7DcGWUbLfM-ch447Sk{vORx&-unA;y zUznHs!n~u%{xjKsCi~Ab5sn0;V?8#@JDPK&IX9Yfqd7O4bE7#o`j2yaZ~(nHE$?4U zOu-yPV}-n9VvvGtl%NKU=)?(m|2hWa5sC;Tf;s%P0F`J!2L|K~7>#k5js;kX)yPE| zc49xeF)Z&HL70dzkbMT(XOMjc*=LY_MjZ~~7)Im`v=IWb1IZ2~JCN)^vIEHuBs-Ao zK(fyy`%JRWB>POV&m{Xyvd=8WR#5ku)O{v(2T^wrbq7&*5ZOUw|7|j6BMQk_iy~BG zFWS*BuZJ2v)W|OduZJ4F)aa!~?_9(n1=%P;4I0sj6Y?5kFdm^;h&ZGn59Qc}7WCkx zygm;mVHP5hgiI8o3iW6M*=C=-mO#EmzD2%8zD2%8zD2%8zD2%8zD2%GzD>SOzD>SO zzD>SOzD>SOKKEUDZSwup&V5&2KiPh={bc*eb{y2L!Ib@$h_Bmt+lO0TUFxltUfj-Wqj|scLtR^t43C!xeQh6uR(?oij zxD>0g9-FZT2hfYt@}6&k{m*Cr^V$D=_CKHfC$ZP037Cm+B*=Tg97JOUvQUhzXg~)B z(kB$$OFDU@GPz7OBWVDQeM#BN&u7 zBmgyNL?=$jd+`{I2Q^&05OGLD9?HSoE@o~QQ{UA6=*F_3hD zr?LMu_MgW7)7XC+`%h#4OWFU@V9dZG#A6NeQGwlP#ZjD+ce;Ven2jhTV=an6_H?qR zlRcg6%gDZr?90f$jO@$EzKrb4$i9s1%gDZr?90f$jO5qF^yz{trULv@5Ua`E_B*;6T+U8T+wbXX)M1&z4>~SsYu4UZ<@)nS{fc_TH z-vahpKo1M(Z@~fd;w- z13EAuZ+M%$5u-6q-kavj8%ckWlfnEVqmYcXpoU0lxS1MmriPnYdoy#rc@@@Sle|$$ z$V4HkP!IB>sO=VNyM@|rp|)G7Ejk7%$VLh1HF`g~<-L_!Z>82-sr6QBy_H&TrPdhg zTujDdG8VU^U*1^uxQ+L533*G%TSDFv@|M(~QQq6>;r0=Em)c;?OBY}dnCnt{x?@=0 zIQETW-#DJ%8H9=Q#?J+r@npu68BbEwm*vQtxE`D3 zU7iYFFE5ohiJT;I?p`Qw@=ST}36OWiXp94|SA-)0>EQYmT)#3O%y1?Btz?ENE$G2X zdGGaL5@sP1WZz4T_fq4%HE0AirvBlCy!Va4c!bKkDh_GLllT7BV88p>@BTetCinNt zyLuGHVjAXS307epT5%Mo@6Tf=q#rq6%V=fAloo%+&qQHGu1eM;wjN*|W@!5~b;9OR<{yFq;qQr|s_F^tH&c8$D`(C;H;Wzj>{UbLfM-bdGCGxmVIM+fE24nQzw zU=iX$Mm9BNQ`2J$5eN2ujJy-t}X^ zJlBVVbL)%2x%DUI{qJ-ztAcT$pMtgMmG^1#pPmAaJsFxxE%Lr2 z%mQoP*)4DVXi!T%YxrA;x1OAO_INi6JLTo?8eaaU;oX~!E_vSzK^B-zLxjBVllMOB z8{04}?+0-x0(&*h0Bf6SL2di!Xl z?^?ZI?gjOBv%Z__yVFq$YWRxmujYX|zG?+~_po;lz4z3hSKhCuV;#u*`n0@9=VJ}Z z&@b;dtp6qktp8?2-ri}bmG|2q(9^g1*e&ldW^ima644~@cLLepmCM`5^S&fddmr;W zZekT!$9I9={vvt5_aFhx`un{Yl6PPUsN;tKko!XwIDR4ml^BrsN3Q>obw3u$J2(mp zz`CEP=cg6uly``_hRFFj5V@ewVe*C><^6^AzwAPfyeB7NJ$U|qNvOe~yr*WN6zu)$ zY8;gJbU3Qz{f*4unE7ul@{WwhTAYygcWV5-Muu#xN1u#8#i2{as7UOT@#k4c1JC*X z#2DQz<1dqtgrhRXM598+Uq>Mp`(*@-#~N_W8G%Ru$Ilp&!FLiy;3_o9IMcvFRDs-} z5O7^ki;TaG2DSX{pbXCp?3Ll2fMN{DFf!3B!xxNnP_xN8GZpnRtQc^f&*+9thTlO3 zMr1hj>YA8?G*rsqzgaTIl0B9>&Z57wI5uu7Qb65jbItha_~UU<#yMPj&KmGKcns)0 zxK_rw)Oc>nxC1c`z)SySk`Afm$Br+!@V?f3QYjHxxEV=m|CcFXwZCK>ZQpoVM0WX$J1na{dw z=Yx4&J0N30Bx+?`mxeAG3scc6<9gOyPi@zqma&NX7m;^EB8Fvz^BCSD<3{?pai@$3 z&fi22H?5En8Hil4{$~1*8Vj=djAGove4~S~R>rMUKo2n!Q72<@IQGkk<$P>`jN4`) zMaB|xm!yMpx5uJd#?l=!?x4Oqs4cEY#+@_4p7Hb0C*!Uh9Fvg{0{UG>&N6ySWR{8S zwLD%1_x2h|l``&LfRi$k$+;&1)WqipV+A#=q{fwhJod{-Vb6Pm!MaqgN#*r@b5JW| zRXCbu+|Tj*TV<@~_39=W4@6+Mj5K;lqrQJlMG1yvtcd~F{JTs>I(4R#`=AN-<9<;i zgV{YqUk_1#=2%ek!_4sE3K?se+1mXw9^rj>gc)Qd$#^snWMy+Mdy|aE*z++mb4G*b zIi)iG6NxSv>ndeDPHm45$l$(1@HQeiF6cx&NW(=}q6w_ZZ>z<|lXPHY0=Sxn>*tkYU zsSRp+j(#^Ww@n;>ejNs7l!by?U)U+5d>ry+yf_|5WK=AX@e;kg#C0!q%GkURJu+Tq zzLiljUKxd%Xpm90Ud9$)Z|Rm%og(8^>Uxzrwl0lh7_>Td|DV>DVP>`y7nO z*s)s1>-72hkc^!bGTxX9uH7{koPU!U?q-j-a%AiwXAjrDohGAhGIq##Cj!GV>N)-{ z{q1GHymEf*z09;Pn@Cz-+sy<4dmpl0LhcS@%{MU**c^Nt5yQL@?K*)iSjv<{8W|_1%J`8ze`L)db^SzdL)0>qE#v1g zp#EX%9^NVAmp}~3I9Vm*|HwZTixC;Wl6{(MP7liXtwP4gDjC0z1M}d&tM_TGe1DoI z->6Zjl<&_m@{JCX?=QA|V?r@3UjWYo3eYYe-~0OlC*q`hXKs=&Xe!#|`y1yy5%PH_ zp;tbGH3r$f8u`r4@>x9Esq*;?<#QI`w0v%hd}DXWcUFRY;{s7C-`N@9`til`orB;! z`OeLfZ$hhl=kdsQw!ZVpo761d1x4~rW{(R)H5nLNF2V22R`CiR;(`K+= zgyFU=CP$b`K>RnC#YOZ;Jx*njf2L|Lz z3j=G?s^t5Zjrl0RQTf(HA{RaK{W}_5lg_NtsV$wKkq6nE?~i;Bl9MqHyX1Rl23q9H z3`HjP%lB{ysBi6bu+Jj~QgJ}OEb7W)UDiqY9*qF&vZtU)zQ-njy&mIO4twPk%J-i! zp#J|1$+s>8%>8lZ^LT@NxxDYW)bj-UJW(xQ9*=po@;%Aplf|H?`~)16?b_L_F17YtO&R~`=5zDSQR4$41)GZdRZ4{tQfw~OB1Y?N>J7%<1Tw#v6B5!CYb5&7y$aa6u{ zsJ)(9ygN<4y<^cK-+T1+-f8(7>f~!2Eg$#y`I^Sdw=Y}1<~I303`PprXTO7RY(kTK zA5q6gtow-GTj-}H9sA|`nCy?2qF%mMu4#>v?~?!|gPa3%k&71jKAnNJ=#=lE2{I4n z;D~&OsO1pn+Ni573RUtQChzcS`P!LpJL}q8<@=0!KdX?hBN%INK)(N_g8WXd``iQi z{JcxPBTK-HzL*92@8X)SQk<6WOKR_q0DXVOoWA0G4?jyi$K?AuPrjq$kO}HIIw;>a z3vp1sUasjKk?-3A`HoTRF`j=HD_`GaEI^-p$J0T6|7Q8Vr>5^)+{{^8|zEiCEH4sa|`P2L?{6?Q6 z4f6edRHiy*{;3KlWR5bCf(mf%&*Kn*67_HhE`v$Q&Pn^`Q52 zGGqqRe{eoJWu8mz=aO-5p3Dh>VDIzj^E~!Bk9yA|Z{lds)5KIz!}+W`KOW3x(jx4T zc>(=iP>cbYlUJZ#=7mc^-joQ?&y*&a{0-F%84HeuQ2)hbT|5ix(JOOm2-tTj@5?2r zAo~(}n3jT8nU`|@(oFQroSrQ6vhm18pUhD93vH44_sQTo{=0p12G`AC?d9}6(?mYH zWL_~7Jcd=symCIMb5^#@s}_N|%-$;V>eVd3zvuKX0eT+nMjud1#V(M-aH?j?FUTJeZ6XXq0*9G_02yKMGSo z?RS}23wlameL@&=Kvu#DnagHltIWi4;CSM&%;og3yc{QGCd~mkN%U|xbGkcEW-|H7 z^po5y^Pcg@2K}x`!7-UDxn^Ypc%Bji*4>)~YDkSlt<3vop#rC6uA-k+%yt#Cxt}@T zPu~6HtzHc>9w6_5G7QK}i$%4}e+j9e?=`_F!2y~7o`Ec|S31|H?~(Z+^M0^TW(Ip_ z&}+t^%!d|&oJ{J-+$-~8uH)}r=EKZ|zj2vsnZerKpzlX`{>U1XgZX5wkojl;*pt6+ znc0al9~*-xQ0HUxl*26l6NF5e>rBx9x>At+cmk+3cPx0GdqUy`Or zEV^X!Zy7V6eV$r`Zkg*-P%HDl4pz%7;IZJ3NA`Z&K!(gh8xx=C9Vvo!U_N>^A5t%QAU=0q)+)Uk@S@$ygzRc_^skO30<|{nDQYW*D zJ*#%e+`@ZZO=dN9RQJi`?=|MD^s;pY_RD;Y8egM+{x)OQvr%y?4X9%3uW#M0lmKw0BU>Vgv?#6+r|1fnai68WbU4hTnx#4i=N-2=RKU;vq$FJ zVQ7_EHwo-n$C`H*Vw22z_OCxElm7<9e778(GWRBc-rfsBG}yag0*=UhKT~F-fi{^R zM1gBRI4!d&13P5y<2~L-ulwkk|Hi@ma4e{A|15CLM>B9#W(zqV^Zeu0*dw!b0eJjm zA_`?5VDAGvWq!)*Py1vZoP(`04^0Kv9BPo+76WE=m|hO&qhDrwG zzu6d&*-3Aoj|Ve4!s8dA;My;`WOjvPtIRJs{$;An?f|fFH#uKT!#Z@!>{*IVnO{@? z*Srs3Z^nqsqq%67`OP@6_M1VOz3kW9BJ*4N`<9$(mHke0{ckH|jxd*zYMH->V7DyI!!B8W zGLegZS)+<^TGpTQWsRPX5m|pJl{IEIdS(4JQC2_z(q)|yhc;P(Hd1g>)|uo4g@fz< z#vYz5^vLo~!5R$9G7@C@7NSp6CR5wS>$=udIs~$eK!@Q<=vlk+P;u$9`Ft(*Jb!nO-65vZb;@IrsNa zFtZsvpV1@ha(cdeNY>0ISyzOCJ;FG4r2%GeC2MA}&#V+2lyw#7W{;C~wJ-w0>;zFpR$ zLRmLVLJp`Ud=&P}y77dph%#CHd&G*I59V|8A~eW~qK;dFP$VllLDsF*ck4-6G0CWs zwRo+p*l>_>Te_?z)O`CaWXoDgA4_-1ier9pEwb*M0?x-%_g&P%cj{I`lB{LCUdEn@ z)U-TTR+0zocXu$3%1YiV>mIUKOqI2Ap{x|#OI`O;AKyt>_f5c7S*xh|ezNW_m$kY8 z&9WX~)(?b%_cg6i*1y<)4cDw0l=W|FNI$6(*l~qjr#r3kDWlqm>eF^j4IA2yN^_Cu#^<0Il zO?k4OUm>e31ii9eXp>cr7l&k3w90yk{WnwB%dD?t2CoExj91vds#+HJBUshU;#JOX zrS7f$vR<2nWLY)LVB1nzwaj}vdv0e2J9xgMO4jRRP>catJNsn4u}2o)V_UoS%X+g2 z?7w@ethZRVCtTLsv9jtG$$BSJR(-y#cX!Cz+aT+`W3n2!_I<8tWNl-ItPkqI^-YP` zDr;XBPRaUkHn?VgimZ>;$!ggpi@&Q|pUguBnB4)^e#$imyJa0(C993|ZLB{`&F$3L zF&fPT7ANgSp@}-}m4^#NODpWz@Jg&33_$n(Hr*=GhI89TvoKHJ+ttO@Fq{kJT1%l2^0 z!+9@R-Y(h31S|o282z$+spybxPC`6NWm_JU$hH@Nee7eh{WFn(UFenVaLzd(+vS)` z&RAZL&BF=VXCiJue&$W`5yG*;6)QMD|6I$N@76;o1<^ zUK}HPDs$j>o_z_Km(VMJ2e7B{`qG8iEqi(dx@2D#g;v?2y#D(bG|HZlF8gx&x}4fB zCwJy*FrzD|@rn-FVQXbyISJG-YY{kh6**UJ#!1<;sfpi#_SN({hyCX8{>(Wl`yW}d z=bBi9VcGv&C41gHkbMoc%@4$SoRWQQ0qSHgu#qDBI%>O)>#rkcA$2XR2kWlyl)Z@k z7B$GefnK@q)()SBy|QoQJ%|VZnGx->Z=%+l24qK4d*o7#$i8_l=p$-A`eok|fmYek z6R=zMt<)GZ14FVGSD{&UY_4qn9&O)7<`Ob*C+~LlxSiUTjzzxgJ3MHV9T$XZ*>|p! z9nZ0Nj@`xkbXS?|gb?hIy(|`$vibaMCsOxvYD)@6q3pY-fZmcPA`R?uPlfCi(cs#Z z{pN_ z`)RIwdWY=78EBHdAq1=`N|F5xz3{ozF2=J_vP;5bZwy4Y?9xox&&`y*iS^G1U|9AG ztSM(k<)>u7xL&b<`|u7B&a>^*Bizi)HAj(Y0Wf$QEG1!{X|Sa$t9bjW^p zHhA1S8T7K3bMH+;I9U7Me%TFN*Fdce)X~r@`~7K1N4xAs-m6BAH}=c^ARZiRqMs(_ z+O!Gu-!vk7AO9QOM}7OKtC^ZVB=bY++Ar{WKmB~f&&5YeWVbMzmi1sQ-{spMli3=L zO4*-K+b4Ol4@{8#X&5+nuv+$^AjHUSV|H!ydN>E{-Oe7Ltw6c#4)*#Vb$9Y!cJ7k> z`9#EGuk0iAaU=`1vcGVUf==08%%`hf_Lm`u1JApup*sTX)7>lkD|+MK5%yQipoi?9 zY#fu#XHfg=GTBF&$5F23{yF;_o_|C3H|*0p20ZU&e%~^WZ>NDZe2;G*TL5bOZUPEG zb|16oW9@OyA5TJ~?EY{R%l@8q-xq><2B>u)4-K+^m;&}XF&{NJCHu!@)XN@Z&VwBL ziM*fU(S#A%Lva|A{WEj>xl8sieeiD$o4>W&ztGz+$7G-6*vU2E{Qrd_U-l`1T7De^ z&hxp|KJ7sw>SX^m39E5Z_DCdJW&h4zzweS?3s5WnpE6J_|ELvcm;cYfNRWSYD9Yvk z%S7bM&))_7V`5M!|6j+W2!rwmtVXN+XDmU#{DF(mDgT+7@&}E^8g$G5H}d{Qj)#3c zjq-cvf&GmTaNNgv-(LAm^7!|H-zt;ej+fs*3LNtvk>8nv4*6YbbqC}h8;2(O&m!Zj zUirt7J+4mvv!g&wunaJnWxI=1gAmeZK#SgYt*5 zZ`dCBuVhYF=F2~8BACgnTKTVHMpqq>e|8wE$%S{DVOSpFNR{e}#5%O9Qs z>b{X$Bj(C~6LsFib&(Um+MAj0&Fme;xu{C{`Ci^1&6;SQ-#Qsh^2dxuI!?&HcnOB( zkEO5McFVtny>Fie_Fu~Ta|bov(Jy~omi%|l0y*(xP$2(Z2G+};ut@%8JYPmliTvy? zXNJoMf zna$b=`5&2pKKZlKd=j ze$vE%{Q0HwKQ#sPvA$0J|3=AQKu!TYJ7`^es^s4|S^iSimbS_N9CdGE?eom8ED+@Lx!Pa8RQ?yKw}QF8L?4@@<$sxLD#>_- zIlOXG{wnI-QX_x$3Hi5jd@I+!Mpg~A*U;OxNU(QpA%^AOPCYxA9p4B0car-?i2S?8 zqEY@go8{llKD$rL{}yZaFx$83ncvO+I=sVq?gjI|+b;j!F8Lcg^1n~t?;nx>17^?^ zC;z^+;C1sX}juv`tq2`Y>(IS8AYH;q85_HOc zfHemS|C@na z`9Eh~pY#0l6`-#p%;CsVY{p6XzeqxZ{9OUycvr3bUy}JH$G@b$?)jjuuO=ZC$K>yc z1~v9j$Jfl_Yic{nI_@#^^O@ZLO`-g~?9;mh&GLWCv2XKmKz=@t`;Rf_@0jIx)Y}(^ z-SQtFgRS!Sj{}+g9rAxa3#|X1`3`XG2O$He!Lx>g4}v6pG~^VirTa z^8Z{S|1fhLE(Pm;iIxAP4Qf4EFaQ6M|9@5T^Lx^Niu_Z3^8Xrwa`{hl?(`1%e+vV( zjBx(<@hFm`Ks3quQ-hpQk#hb#5$ULvGdf((Up!cZW;tV)$oVVJ116zM&KU)A0>`3C z&Y3xKfx5_bA%kfQ+W0GU`%ds}gvB|Yh%5gZx?>WZ>pMjmRYvgd> znlp~qXLHTjTzhsYxNdwHcs`!z=TPH0*%+1+Og+Ktli?&Wsc^$hn*vE+_kP=63mjoS8GR0@Qj1dtJfI`0m&VOGdk#D;FUT!*XV= zLa&^w<|7@Aa%OY=>(CfjbzYcBpEl)0Bdiizo@BTUQvT`Zi&KPut)R))ZwU{Tcg1oV zkDOStV_6$JBImYwNJFEXCDg!o)XoyFT|&<7V^M)&IZIEhtKEE z-6`mllgxaR>*d@t8Ch~xj6tfLmE^B113ji>fHn7qg6H>ATWTQKBXtwVzOM+~a#kgv zOV0g;a#oYMI!Dd}CXUKU+au>+Wc+Idn&qqs0N4L}EarkW>FYp^55|M_84;+H^AL4D zL|>VSI4S4hN!TH0Ei+kLE9a3AP;XWk8s$97{2x6iCp!(javoca5ji=9=#=xH2`B}} z)|JS4JQ(EUQd4d=2IV}l6wE!3Sv@%#yXE9_UH(=%PfbI$ob~LxzD3S|*UBlF0rq;j zLQWy|79NwcAqV|(ipY4zgG3C;DK3-q>{Rr~DWSiO;b7LKc{nBKxqLaBGQqj$LqQ+U zlU>Gp`9curqkKH*^+jgIeRWO+eY_L{X3KX0&gMutFOLOlE6J~9p09AtE6H-I7J$9C zu(mow&Z{QKd9?=gyfseFYqLR*H7h`E+ZJMzoLX}Ee!$sYAZJG`IQRNEkokJ2oSkI8 z(I9761gQDVN;$i2w8(iY9jxC&4R0@!Q^)Z-)^d-z^G=7Hdd}Am%Xv3j&R+8NQsaA7 zavIiPmz?*bF(RjteLl#N(?rHTYTZ{Pr+d_;DDTuL&3GJ zWVM##l$=j?$~llE=TirLat`j1b4b`NhkMSQ!}HKCr=7k(TPLRj|ErVJSt5sf#rt&`g_>x>jXJR!{mHJjo<8*)5{t@H#^4`%Hh8;bG|zw zr>|cQzu%pH`uU!|zHgE8CWbL8+@*BMTg^UDM| z{N8r{ZxUkVoMOLUIri%k9F=pLbH6czkxV(i=gU=`+&^W=9W^X>bO=t%{R^-E(l7U~ zktPNTu_iqt$Jr#1jc{nQ9h(x(u-&o|JQLZ@|vDhh>Kg_wd zPzKifQ?Ns>GajYrlXV=NSn%8s2$^FL|q|4>^ulvtY7?R6>OXXg(UoPKWyYrL4dhUI9uZ=}L zPRd;{4_vok2YTgRHwB!(t`;ZcE?f$(yFM87bNxZNi)LUo==X-1$Uu+W@X1(*cDXmk zpO87*P&B|~y==iE}RTiPO*-?1*gU){KD?3R0HDtI5`d3~1$1#%Opi{GX0 zGF~t1keir*BXXCsK54DoyB%;%a+%zFsQaE%a#s|}UCI1b_R38mBW17Ldw0rBT_g9t zF(79Z>+fGJcXg!P2bkpp)ScEKm+!RQHC(&qfZTtN279E>ko#aTn&oD2-9zbeGt1>Z zJYVkGAh7lkYR(Fk`{)An$j#1|`&gCS9QOYYeXV2f$MfXo7R!Bt-t*WmpWgCw!CanV zkEdAk6tzBeTJHK);QIfXh{I;kPr+2Ap;hkF^zw8#YUCCMVj?2YE_Va-F5=pv5U@X= zd)*@T;U04L8G3rAL2fbq6~|(y+-Irf*%fk2Z2a-KOYTO2`ZgYuTgtwrJTIm8=jMPt zHm$}{xzA4l*F4X$GHNKRl=}kvyug0t)KN}9FQ&<@U|tp3a$n-Qm&o6ogb}%wbCDzW zl|s~mV^wQVA$JRTTN30}(?@kOy5+t~U9VEZt839OcWVsDeT{x!tCL%^S?)FiaiEr3 zda5m#yL~3OX2$~TmHT=C=;`$Xa(7ba8}#u8v)r{%?wgq)Yxj7R$bBmayeDsU%H6}U zJ<%w_F}ZIq1$lL3)G?oTLa{?`Ju|3pl>08VzFQ!7FLm?%xceU0zem6C?UCES{2LnN zzCQ|F+n6Z#g8(p#4^GJCJ8*X&>-TlZZJv(xaz7-Cd#>F5rE))-4{B;*mLJbTt=v|8 zl7%|C2c{ts`8Xn%`>othnZc**{pqmWgOgE=Cb@?^ScEdP%59^jHfnF%C6~|c?%`yx zS9>tX=fC-KKcl|Sn&ozcA_HwWE%$${{U7~wPC_mQ?>MT-QRZcJ{Qd1oi&P+Fx5Wu%ko+e`C*YJa%#oJIU2~Py>I@M1=jJ}-jTPNeVL8y??FC8TyC*PYJ zaRTxA48S;Hxs3iv*e&D4K3F0nehjGdq!9Ts2E<{mjDZudM}{#)hRGhYMuuf$9rnwJ zq+){%oAvfW8PUly_&a#RDFyLedUe_3k=r9qY$R5J9{l+-0w0_Yi*Z;+!crNDBS1|j zQ}fBhJGo0n(lQyROhSW3OnTLZixR*Clvt^u3++pMzMy_GZ^qc}2Y4nv=E#qA3JD0WT!$7?AmdY5; z^Wn8J&Nt8^V+6JEnYMAkZW$vF%D9ko8AUQKVkQ@nYZP^jDwT2ZP_)VzP2NkmzGJ4z zxHM75Sn3-~{gYYFx*Q}AjJ+yHxHC#(Qlk#L-mkwe~Cja%BGIEk-+|U=SpRz*6jq_#Xj+Su~ z@$-6teK(Jl!S~X})YUj7saupH#UI&|Ha8GO8 zM=x_YK4+(l`!~p#+bZLMgEHok^TFZRC1ZXf3S~Uh59?$s*d*iOEix9?$arL&j72@c z^G9dOD5i(v|9@oOk7dhP+)Kve)cJV6jFRaxo=C+m8B2D^c#>L5N6C0an1=suUTojh0bOjMq80hP`jBkg=9MYdOAlDmrDnN&RoGl~FSkS!k5;7InO} zSH?OE<=8LdZH~Roy4pD8%Xr5_yNtS-;PKr#GS>IUA{p-u$4(g==wSo1d!P01cgWbt zx&P7UCTiM5jUUXFv6-A7QtOA?WNe|Pk2uHY+Qvupvb8TVQGo+8KIXcAyj;e%9>@Uk zw$Z~U$tXmFjO_-hWPHlJKHVf^M{mpk&p%_$XZ14bIaWUfYh--RHT!%rDrM~KflSn( zNyZmLLB0mAX+sgH;ma{tg>D(U(ytyUs#Wc|O*FK7|QAQ)PX~I0e$>jhCMR&jmJtEzfj9B)iQYBG}^by z_?7GMYd-2_bgivxxI(go?O$P6o#_!aye=O+hk0h|aD+K$xYGnK=jK*de2ON~k z_>21gV*kNhG|Kp!+5Np%#-RaV|3BpahuXRg%$MAoC=SowQ!&0AdW- zCvzZm3?#on9ei$X8oOkg#4^cgRmhAaVzW$}ICibfDDk6RGM$w&T^}VfJ!nS35@CXK`jnWyx}JekStNhZgsUs zUgqF9ERuOTb)7z4<`5g5GS4WHIkZUTne0m$iguZ2aXxhbmdiYwV`o$6+4M4Owajw{ z$xMq!Hh6t5In#$@nauMr+yOld=iK?kJikun2wq>nnvud3nHSRkh4nHsh?T*tE}Dex zGDi{f;{M3NUYVok%DjZxU9v{zm_;%#9U*fp@h@XOmvLRkt(SQ@wO-D3$=oLMiiI-A zlk3XCSS&M(9WpnG@N2Z4Q>ooRkUTU&r&w zxiYUOZ;mii<_(;?VZY2Nhh*M3L1u0$sNp7Rx@n!vygU%^W^zsKjUt)1q{y5$MCPsZ zmjC~VdmBGz(?3X5glJqib9&MK67 zPY`|rW zP%iUfVlV6m);zLAChv*nqvJrFVqz5Ulld4kTD(Z+<72QzCil1I6RcaZR_2qeEA=r$ z=2Hza%jU~`x^0Q&#&nr$>E%t<)YQs+YlzHs zT$gpLW!4S=>)zq9j(*-PmARfdZy?`>WisFIg~jNW$^D=G~9%Z1%ZN&Iw6zFF=y?jcopBAA* z<_>c2sFV2_J$y!8^*)I6Iq^QH?ww0ye!&dBpr?l3AU5w~<}Tv%9%g>Uv9A`&+&vhq z{hHTbSIKNl!xov}Q0q55@>#6;ExmoqjG7Wri6)ufF@wFV-AfJM3)^KjljDaBu%;yy zT{3@MCbKmM2W0-l%-cqwQ|8aC*;j}iGJhE=vpox(Z)bkLj>Sru9rW8#g#9vq-QemEpz`cP~RVY!1=BzGXG4%Y%r4pqtGVvFM9lo{C^RL`!(|**Ya=T z9GVQ){nHQQQ7W^$7v`fw=D+ze567ce=6?b`aldA1wX7bNEdDOZI&!nDo(3{diY+)K z>!?ZKu@{fMs$?CVhCHm4)w@3y$~vY83UF9fpJbHDI@ZQ??3LBGFJ_@p)^UZ{C9B_D z5cl{H#EoNLT(+zedZJcVf1dN+WW^_;Mb=5=J!ze+0mD#@X0U%C`v#830&t%9D9gwI z`HTixW^b^^%*9e!7V#}!Tl8qP%8IZyG6Sn*+0<;0MGdGsIt24ki#A!#NECwCE0{j+s4 z{Uwp_6z0o)p>;~9tYp?CH_AG73^;cxbqy+#b()85vIb8;G1_IFJ_QG54Jkp3tTU+V zjJ2}3SG0x}pkCIQ)RN+3IaqU6h#9g{dtwFl%Q~C&XHN#XhQ*^y);YXBXQ!;RN?GR) z1G&?QpH6@0jR3U|r;hXK@%$!PBiJ`$hpY>TeZfjuBNxiz@1m>=H{pP+jQO%I$^vzd zS|saY3(c}d@0NARY*}N7IcA@%OZUneI|1arjK0T_bKF5$mlH3O<5vuqHC`YG?~zs( zGrDRN@?>Sx)75=sP2lx4j;x9KXpnVnCYZ&fWK_wzj{VoAVyUdj{lLtwA15n^y*ZV# zZs6Pv%VbUIg=$$h68FYjY><`P9}~gzoBCq8tUMm`xE6WaWZg{Oo9AP_tf^zb`CF2} zTyEJcYuYrhm+xAwTRDI0Tx^w<&;0UvrPbo(uZ8 zy+ziH3>1TT-C=-pcd%z>Z_v|B>Yv#u>&}^=r#tt_Di{fR=l$8bD+Keos|*Ka6|%pu zPS)MSutwG_AKBO}>mK^Nrx3NWifqtR5jEZ06FFekvy-t1^vL(M)_sd*&0*i1CFquQ zKe_KON0+R*U)6m^Rmz=>p>6spqKgmL5~j+=b_11C2IkB7Laqn4s^(R zI1SA1VP?0GeipLt5qfxp9u~20(Iimcqr`f2I+|q_j{to=#;mwswjSFeYcXpVSIBz2 zAF5@Qu)c)2CDi)_y+5&4){?PcmQSW)j;vB%mr@gd(``LPO?>Wcm8D=R_Q-m=K-SV8 z$VaEFXNdDmy{u*Qz-QgovlGD2U3niYk@cK~Qd!FrL9NSIW3Q~|dHp>5SB%6WFeknT zw)nlns$eb^ta~vF1)RwQCGE$@(e}^s<}RUo*$ASIBB)4vjqW?}@E%X35$^y?d5ppR8|**+j0U z&9c5D7T+;jdoyuB7WdrN_g%7@IrhT{td!LfVi7q1V+t0_Y8@c!Cl3q2@irdYn9a|H zV2=By$@+y^v@`qmDp|kwMyafhA!wKN8#Q&tfuGCHPFcUt#Wq>{$AJ8Q48m4f+*?~+ zMc6CrPiAmn5{UoT3RwqpWc|(gzlnb+4b8Itq3&*K>u!+sZwbhCcmkOHf6En7Dt0Jx z#7Gn>(qj-B6gjd~k)A_QugFn3iu4+-$kBbUO_AQ~6gg(FB7H_+gCfU{MVlghD-<~{ z6MGctHw}9gIX)4~6p7<8j@KtlMVBJ|=O}VwFI1yLk@#{&PU?qNMFuQVWFYnMJ4nPJ zx6!SLNp02uG$|6H2D?s?=oCeqF`y4OTM>SLhEO;epi2 ziG_-sPi-R#6uDrsA|sj2g$oqP;P^$e6&V#Oaxpz}{~H;dga$<}DZ@TR#;jH3(k+UN zU7^TjthLS{1o&Dt0O|d8H!PlRqb0ksFxf4ZNPRQIQ*`E0W9eo8~Bz zN6&fey*W;ispOg3p~x+}6q#10$gRZ9r`OwMV2mBzKT4TqR4V;f1b4~sPzSA zS;4Uvsc$96Um{=Sctu_=SL78-k=49@m71&K!91(z={0h`MorZ{F$LQdd7ZhuJ`+uf ztjWbjMc(L#>DZ^pTGp-IrpTL|tKny771%BomHYxHYalSmH$S(TbMU1b~!P?!kL4RLQRHU&diWT8=+Q>KT*)tX^ z6!|t2%&dv$--RepWN#luzK=(_BF)U|2m1Jdntxz6Exc}7smPBu=&_Y^t<{SBL=8W2 zzHKUa{Fyp`Zct<&HT{x~CPmr@gY(=2M}Eyxq$3qoiu^Vb#P1|;CozAYg6)dz&jIK8 zt}^n+1nf|R``$=bvm$>E!(4PJa)4t8nAcy#|BF3;)hlu^1N#;EyAXR7IkZrbe~AB2 z5e_QSO&{G`75SI-|L#`g@Cb1Hzg4mokBzdA7=~)uJ?5ZZ_K{;`_w0?$vX4r}PT9SR zWFH*|*7fFC??bYWStGkooowDa>|S{*E0KLd5-Mf) zUm*L$sj}nqunb+YPco2?b!e46pg)K^pcWmn2WEqOyr0+xHJHK@w8^$6fPH-SYDcPM z+kHVDHv9N~(vEh@=6=<7w#atr(etoScB~i5a6q;{1LO(@VF7l?4hN$UKt|1JpQ_V`mOSxoqxX?G*N=9F~1nDrU=0 z?G4tY?vQ~Dm#t%X~a0UKdAZKM%n4qoKBtT%>2AX z*e{#+IeR#{&mW1!;Q0u0jwr=$*%x>q<^{}RWY_?PXGJ#Hqp$-aCX zmZMd6<{;2V=6ZC?zG6D4W&A|2=gLuNlASdkJYGeftH_&egTAj$M4{{neUOE6Q0p}V zK)!2uK9Qa$cFMk%dakXLJt+y~oODR`b<<=|X6@u++1Dpy8TQG}A#TnRu;vDy-%x@B zvZv%?mFyeiQ6oDy8|!4>lnQd^jRpB`?vF}z$)1`9&fU@r6|$#gpiwsW(e|yiV9xoh z$*-1u8};0_U-tA&G|0Z4(jmwhMs?<@mr3JPW46^HTQ zSYbSt%Dy`p3uVvhjsJgS?LDl$XRqv{QK&(??0eHO6;-llvv&4mEC%cE%aJ{20Oo_4 z-rp^I?poOoOvFLi^H}#_h!wKubL=5{euzFFqSgiUy?{O*ruK))wJ;l-WIsX;i-df% z%6^o!#XhQKKbC|d?2yghec6i}Wk0?EEwW37qfPb`%VjSa0^&T`4-K+QiCwxu_EW@p zit}a6qHMkFr>XntCfQ3_yObEuWXWE}nq{ncHXhVf&araxJvRl-vX_&8`61cQvxa+E zd&M@{FA%?ink#0bL-vc)WUsW*Ap0e9y;Lu|lD;cB|8gSAWUunDPWCGy$g_Gli2166 za@kd5v0L_Q#C?t2uWglG&7SI9(D&=q@%l=1$zHP%n`FO1t!w*WvFtaQ!JD13YsO)< z?6-W(#CF;1(m+jb6Zh@CvTIXtSoS-sWY_h>91!o_JW#{>S)kVU;z8^U)b{=$aBSm5 zkmrB&w5d0?$o^my8f0%S1?N5_?iSW>IUxHZYTZhWTdQP$%uGI}mu(Y3J)b0l>#&_U zZEu(TX#oz(-a(x^+GKx5y!sT(m;JegF4;TR%KoBIc0(q1%KkD0weKS4u2$J!&6B-5 z1H}8fLUtqdHtv`G4Kel%Lx=2dYh*VSfcm~$fI8WG$AdZWdx-r#=bDMp%)TG;Ww)^J zN3P3{N`8pR?NsMq{_^zoyGRm@E75-k{FETV)^01O5E7 zU3NEp{>!<4`B^&bfOG#1Q&c@rtmqLAN)+u8kL5V5=#d%Nsc28u^<0S#MUP@lufaH| z=+Pq-?cE18iXO8>(LTc!J(m5)?oqUFDvA_6ZmOdF@)SKj4sD9YRVaGG6h-?F!2v~2 z+^%SRmZB#OQglFHjKz9I2UaR-OjFeC1=d)+ju1OS4R$V8Daz;EQOCnpMcv(s^8fXS z#^x&Ohp1OHC{;9MPqPc%h=_bMAcl9I-*s3z)+N)IO3uBiVo9LhM&GgM1mB&p4py zMXMAYm8_UUAF?noLr#j^(p95l=sf)4aA%>UeO!L%X?)sm$f%Z(L4{uir$C)^%zx&5MR~uA7O|3Qx%(BJHwxr=kT~738g;))#jv`V#qHYEiVZPSKZFDY}Y!U*U1}d_`ZS_bT#L?N#)(-HKL|^L37` z;hMg&QPH&yDiwV*71Uj`MA5gH+dArdoBC@#FpGD}6|G~>yY%z!QbpGfRrEdfZs?`x z`+d=@=tg?q#OqC?75#v^`HnXF;V?zFi~xOoMBJ^^{c%4Xu>1Clz4)==A(NnMqhvoDx#7;TKq+%)B z)^3qhJ%^m>BK#~Q_hfaa?YU6GuFu&Isr9u&Wr>7o!KHMWdzFQoYfP|;jHy? zQYXndo9DxPIoty}=gh`tF!MB=%RJJVQTjaWk#ipPpSKKqQHkl$^=4NA#;w_M^2vQ0wQ*17+|C?kP}2Nmwf9K4RU+^ZT~RnbR9pa_+B@GdBqvaahg+)H{#8 z5At*K;AA=TedNgDJ3;56d~BDqfb|Osuv5;%#C*62)V8n}ShJ8`9!Wt7Hpp4j2TRZ) z=h0zUEvJ}$#hfp0lk*sBAKN8o@f`5@_)sha=SnzN!t9=)*CoO#bjx|NP);ecFXehX z#qqK@&|6t04$FDEMb6UYa-JC_XBo$y-7Kekubk)V7@}^C#TZJ6fnoib~!I+VZEGH6F}@&_*r?S0>ob(A_sMHUZt*A+4E|x zoGN;#DwXpZYhP=SQ#}Kna$e^;y?#*6n(1=hNCt7%j+gUhUlfCWYckO+=dD?C)}@0u zZx2AVoLc5vOKr8xwU#*VP){BC-(^4dM-KN#&U$jcClt!r5HIKbo+y*EaT4hFe{FI$ z6`)1V2jtjH|C=|-`H*;9_Q?5&bsw#fvz2SJb)TG%$@y_IrlAV^xhDgx*~7kXsrB0h zpw^~B?2+>wbKN@%^!0rT*w>tiW;s95#}7N?v?OA>oF9q*Be7bu<@`kMpYlMCHe&re z4%E3X6+7kpvQbX^7*O-C%)5iWJ6h!YMx5W80pPPLqp{JLr?#(uX~f6f9c^c$NtNZt9f#dm?5`E4i3pZGF@)Z(Q=PUK@m2| zJ(^>^hs!-?0;=TpSt0jWf%C_<%I!M^4RVhgg;jF*H*>C-lb-x&3#` zJ#j4RO*zfnkLb*Xt?2#Le!*;m|C2|udVVm5O$$9b?xk=QM zR4(@v;w1ZWPwk7jatGPylzUpK+`;sFI=!C0M(&Utxo1qqY8;k3bd20H4RGvCj-|vQ zAM8DA0hmWBaZ@+QJ$o?9+Vsgq3nHbTA*g z)Om&v^2WufqYkSEhnBS8kJ=6@u%K#Z0au-&M@+ zs##$FRpiUg!zQ^`r-53p-Y0hgbx+{fH6Ezp8rDr@&%|cA*Nz0|CXE8Ky)GUV=#V>k z1eVFYp7~x+{_FS3&0!un#bAavu;&JPnZlkag>r9X_BS&78>{5zk}H?qb6e%!ME^H! z0KMcfr@Sq4Zyo~j-P|U3>Rh>emg?T}|BoBxP9yHLO1ZZVz#??Y&8LU_!*Xw%h<3Tt zIet5}+)l0;nW&L_2eY_?9NbH~{2t)mxk7G%k8;rSUF<33=b&(nT>h@ey?e9VS>&44 zBKMwbtdm>t*B6B=^~3 zx#c0K=ebF8ms7`bdU<|^+!YJt^4{-OuF;A6 zx24Gaq(3_3Zr>^Q(>l33$p2ZM-1>2HKOY48*vXnNxPA?(a(VxBcX9ly9J#w^fxV5? zw}+VgU5xv!1CD=7tR~_&@w|y1nhwkTE(;~tC3mldY>@B!KFGv6xy@XwW@0y2%Kd>@ zKTHQTa9``TWMHA(AA4d3y5zQUO@1QQPaEX6jYX^6eZ4Un+vWa3++SA7ZD&n8@qeYB zjvknbX1Tvjz#h4sJdRLbi;6rJ*pnJ2H$ac?CV9sV z0MC!Bk=M`0c+|-|zCSpA{37g?7e@_o%jBIf1Xb84um4!=mUrSHa4x$zV+ewO>RJ7v-W9JLQcUfwl53jzc!;LFMrZvr!z&@S(qRBVtpk@yp9;-00!1}v}ftZD(a9G~m zE9A`@jaGU05ci%Ic}1MRcNVtEo1H1|KCa_^)HP=gHp}C)SZ{6~*2sGxOWr)@`XGJI zr;quK@*bl01#$8o&XBi|nLUz?#h~X!DQlnFA+OB9G;sduejw-5?0=edOX*|jDjbr>cZJ?FrRbKotWe&wHs+y0UU@p0 z>vI-1%UjOR!1B4EmgiaX`~i6@n8OO{e}UI8?2}i~2jqWo40z2wviDL5W>r}x@8v02 zCvR1?yjRG(dWO7LnfI#&U|$tEtEQp?)bv^w*2=3+1Uah7_4*JH>-A1~Yl=XvYv}t8 z=J5tUGi!T-wQKjt<8PO|H;Gl#8xznW?=5P6i~Voym$xn-&GOzR@7qg2owd|d+b-{& zMQD*%mxj&q-km0o&xpPC{9L?8-uKA6VS~K)Gv#ee#(a7FzaG5*k#AED>g0VuFPl?v zP~L~E+Y$%P^WN-j9e^%*+#7q_dVraHGF{&Gc0#$QG|Bsd_+KoS$KStt4XkM(_LoVZhc8#j+tnXD-^Dz>s*tyvoV&TU zySK{wdN}4_jl4!`Z=8+I^1h+oZ>WQNV{eZG>i%{N*xy8+rZRcovF1CD?;S7idyajd zhbDQ=S>X5&&sa zuv*@)y+HjPld)FbZ;Rx0lD~7Oyx*70+dmPzE%LhR7M#BRm$zpuU6^iX|GL=0s+5vWHn{R4i#6s5@z= zVy6^g4O$gTW(LVMik;dM6R}0HLBtreP_fg9c^WYX+hFhDgNkv#9y`5Mu_5$4q+GEx zQbFxQg?Wmd$?-F@L2W6lO`+ej*nbv#&SHORKB(bra-B^tXR~hDFl<-soD}R*EUi$n zbBS|qHK;M2I?|~zeZOMo&Bi{(hEGMeV&_jnonj*rQLfkpgD?TqeZg+UMvewQ0~eC- z!UKwB6oZ*wGz(i58&!aM#V($Ljf(O2zOm6&id~YAJ&KKCZv1_m z3Dk5=I>d& ziKU9&-Vcq6&0rRHSYZ83>X^Asu{)W=oz03BFrR`N#qMIyUG!AQJn!b*-K!Lv6$kpg zhx0{4K;CTWJmuvO_F&@~U7=Kq3dyu^kZc%K0mSPVv zr-wEvwqPeWz?{2uVT-pVV7d%JeF4~ z_FREty#L3RA5`pl>RUnH736(^ekzhcT`w}%mF#~h9>ji$wUs=+JV&ur{m`Mr>sa$PHN4%eSnW#1-eInF(-eC*RBS!#)>G$uOVF$sfAbT2pWfe}sn|y5 z@;~x#8m8C>aoDfeW@h>!xjv+hE#&&B036?%qu9qb4k`A@6veiufag05#Xh6Adg6XQ zSh1bGK;I4I{*stqQqwMGu$#GjovT=5refdhQEU%2ecP_scfHZ6*xucWecz$j56txk z_Www(R?hvzV_TwPKNI_BV*RpIvGy&Bb0hs0KY9Dn)~0|BS*8#kz-s*Z-35-?fSz z9*WtZ{{OPEMZQw8TmBISYUTIH#V+|r`ttc6*YCMZ{!t-V(`z&q$Uk}zn&kH`l7CDx zTIBbcgPrn^<=nCBPx{?9%ne;Bo%=EHZgKA#u+mosDTN&QS>T|u2!)W{#t+{Uy1$|0bJtoibsWi;9{H0Cx-~ee$HgD z_lBABr*P~>>b;S?xx~$-pPM+AM}K)8@^79ae`*gfhpE(k%X0bCM&p2d-k1FRdGc?| z25YCYc6yuq+o|pLR{1mP<=;UKGiQJq-B}{PAP&@e*8=&41LWU59NXp3S|tCTUf3_c zh}!Ngls|hsm;;~H`g5}6-#-ZCpSwjqf6waA8!4an9Djaaw8(#`RQ`fQw90>&HGDVg zFKm+k2+tRl$$xaIeBNjL$0o^NY=Qb8FOpwEtdeT^Po&6S!ucm1FzeDr`A^Yb8F|Wx z^K_2TB-&fK5x32Nf+Q2iG&s3?{tGW*=<-fj9{u*YwcBp*r`}~?2XpsL_I+)|S zI53}e^!T=o`Pe1DmYQmb^A3I24FI{{?Ezx0_dze~*~53F{(D>HZ(vp%4$6POME*u< z+gJ$d{vY$$vK5e!YV{&?EPT{^zr?8N}MjOn0uwVfkOo z#A^8s{XkC*^zh{*@VIN1{I8hXSH$FdQh)b2`Cm_!-^kiV_BFQ1|Hea+{5?HU2G)I> z4)!-y$^R}B-SYRc?|b^^Z;B#${}6Nhhx6T=jC5#I073K81ogF)M;*3U==8cP(x&k0=rT{G*5xk53FQ(>3F{Oj#A7yE6eNxX`4fqGGBupMSV5A51?W<63VZlIHQ=5t7}P_-X}vH*!Qh#w zS8#fWS!h%+gc^n{LY;y$*mFiP4k;K)jG+w*&LsYsrP!_@g+BOxHAva3;4I>u#h%nL zSPAx=Jr&IghNYle!8z2EHVDK#w3dtGpTk%AG^6{0M!t%A~e1y3yp`^z}~^ace>IrhvX1lZ){iaVmz|YpB=*ub@UpISCDO)L?Nd<& z&VAY!^!F+IKHa5YMFX!*{lwm%R)TqOUmLW|#U|`m@H2aVUZr3karTV|`S`py_=UZ{P;5i4tAa!1`)3rWt(zXZr-60d2NnEFtbgg{a3VPN zUr*$tTcNVCTj3FXF$e7md(6Zhg-0$!qr#rUu}R@ktUan6Z3=r$M}xwn2cTME?=-AI zr@~`qV1vRwoZ~a(kbCCvSoR&eS7G0&3Xki71=z2!U%kTPb3rX}OR-hq2|Y0i+Z6U^ z-HCC?L9@d6NoZ1d(pc0g9FT+p5PRSltioZ1#$tu02l86PvMLlt`hc}|KTxAh{Ah?G z98~Dgx3g2BOK&dcymZiitW2Rl0Xq~1qp@0HNIfC-C-6F9x57mBCe|rDnLQ^j1@V%Y zNzyunr(}V;PU%*dJPFGbo;nUS3i&)ZRc z-!He$eprJ;aSY_EY79wQF!(U>{2)^6T20jNcN32kI!2s-3IFeW+*Pu(`g^8$Cn8ErCdb=nCN)6CIAIdDD!hh1uiPbD+DoaUZQX+eN1gucuOwWJFNiw6yCZ} zVLp5Fw<^4io^IQta5_0}_pnjnj71>E9aGStaOOOPca8<~C?J0U{oFMj^j8?7RUyAK zgm-r+oJBqNSg2E2#QuBf<6dSnI}P-DA2rPBgQ?i1@P1<7->q;i@#d22fpMUQd85Ew zA527%!ucs+{X;&ou?);_0W({$N#Vo9f0*7D4gvK)!n#McD_nFy;iFR&7L&7hJhmu& zj6IK$YccB4uEN?(@ZaM*e$TOHVl-1z^L~XtOas@gWeM68 z{y0ZrD|uUa{!@j*HfHlPwg23ra3ANm{| zPwYRa?GNhu#y-3#zEHoU8(TUJca*o{-1*iyEiKQcND1Y@JxmO zk^jHLO3-X295E6dO6aj#2}h1sLeCypsRaK0WR6^S#TJa7+pgDWT7FB^=ui zYn8w~bHZ_h(X51iHA*;skrLu&DuMU8gcDko(4S)`W};CE@!OPe60rtsRKma|N-*NF zT?r=ftUM(|dZJ1R_7o*VITxLv1ZNn?>5|8@mB5#V34R|CBVb?9t%NWGyOfZSt%Sr8 zC|1JBy|GUTNz{1CY9%C(R>G;o8!ON9!Iu5-?H&bekLnM{&NCNq=FBr`LaOeUF`%p^0DOp;8JNis=hl9`pvB*`S1$z*0G znVC$!kMAG%+qtfD-tX71vzu$zbuC`80zR>Qazunh3dB*%nZ!M_K>@y#48$K);H-5D zBvdMJ_FM(VnW$0VoD6JJVEjbXDR6EYs3~!)0_T+~FoF2I?gY*+Qh?8I14+c-eQjVO zHD0(%fl1Ugsa1iCHYqT9C~6hBn0*%?QXrX_$y~dHJX6Mlx-VUzz*J_!-}VMB>r^0x zwU<-#%lCwV8(EvRNCDns25vg2K=wQZZf0)|_c@2T-qNN( z?hXZREmUCk90hJ01J>q|^Y$6oufUuHuxY_u2$fIN(B~B$Aj#DkToUr z`VjMZXqN(|MWBX<%N1Cd2zq&Bp91_hKkz8$%QDcUKsmKOo{4&JzM=$&6j)4-#l@hX zCBk|Io?58@pT!0$IsY_uFCBs&1)d?_GWvNoO@Za{3Oq+2&uv#=#bgDZk5iy38r=%K z06vQiyf_kl3cN&))usY3=O|D;9OPZ&EAZ+p1=fy0ivq7LP+(oU00`KrMQ5UPgyZ^6Of%nM2c_LaBcz=}w^-C1^fSEPS zP~byyHzp{sB?iRVx>kXYRw}@Mivu6?xQRYLnTZ1me44Gmc4B@;e>)5XJ}2%@`q)X1 zU4uYvUoKRjr9pwOY82SLL4mJZ6xc(p-;jH6hXUWWEAU;K0&NzW6!^Ygfggy|&YXVa ze*Cygf&E1a{6s$;jSBos>`r3*!mNMkQJ`xn+7#$!Hopx3`+w*0!BPc!Vifq3b-m25 zw@QJ(hAGfDPys%J4E)W{&_C4LKS6kwb$vAq9j3MbVj#&iOMXi)^>~0xD56T!eO~&!-Wt?DQmyF@;J+TzMGGd5((lQw* z6Junxj8m4%;O{eyQJZ9(It)o@lrefdHsgSd(`wKsBX*;V(?@_@W0J8~#u?Oh1~r_q zO~%;iAm-Q(8G+d{3=50VBO^EkyJeVFGD5@%)ym+%jfOo0WgiB<&^JRGXAh%B~ zeuIoimW;R<8E0l=tBiQ!#+QTI&KeDRJF81Z0<|O%|LlQCMV*Xs(IDnHW^~RpRDin2 z6MOs$8RrfL`Oa;Tk!WHO_RBbrxaTcIw~Prhu}#MLv7pEE_sB?^fJzw`uP{J#QD2I{Oj7D)Ts{TltmF`avG%~(+P49?BylyNP!UrXK$o?l0->-c%fq^8U! z8P{9jXJO_Tl%i3_4b*)D_0MAMtYtE8bxmKM)ojp?Ph_vIpofvmYl6J zZb_4oOAWd7liMxh)=cb{F?*Jb+XiEYj67oS8KH6e0@TZx!`$Xj(;Ob(!SRj*GV+;q z{$Uw+Zk91O3NvKfH4wxp7>cDb?#>1^&6@+(-9z2;=gGL2+1yJng^Oj}S0tlori}aP zrJj0Gk*K1hrQiS;0Lm8_HTPysq*lrrOor=m{ALh4=EFXIv7FXH;638;}# z#=ghsw>%nqWjszD6~wKe?+l>VImJj7s)bw#s;#*h@2IJTpMX zGG?%>N5-@C!|(CNa}&@mV?{C!$asE*j4Jx5qK+5nYvn2#FP6(#HBH7#lV$MVdgJ90 z*e0WTr;JyKzlM5W&6lw@SH^41%sc9M*DVnDvS*t%dR{ypPR zCF2`r^bPlYuZ3C}-;Tv1P+u$kw355EPsVq7*de2h8ro9OAmjT)ESIs5bNkw5{4fb7l`f-iIBI14 zP2Yc$=TI`J{huh5fn5Fba8Sm-?D==QjKkw){5JqS3aU!M|1D8)z$yign2AFQ4m_wJ z-=_tS=V{1I6MvY3Z59RV9W>wPh$TFN5PW|6+A@>j><=)f~Ury7(C|vL2z`Z zf~O@a7)uSY3(>0J>Ar$vhAMal`_3Tu*f_9%Y`cO1t_4aIG@>vc`xFdLK(&G7f;Q)Dj?NrxS1>#i#B}M?qgJm)L4OkJ6^u|@gxca}D|jZgoav%R z!FXnL7X6(?tqB%(D|q%A1;;VxbMml9!SRETtsw6wf{Elmk3D>b73A+hg6F4T8K^NS z9d+na@B;Q)693gV{{E0uX($=b9T3SKn?#7w8o zbn2ZxT)}JNLEITl3SL{GU`DBe*D;Ih=q)n|OK?EJ>!)HhwktT(0_$cHYvy4EZ%73- z%_9D+T+}FdBemU_1>$DS#ZCopa*++zX2*d%*=-8moCl6M9CKKI3$@;|LBU+|=d$ls z`nZ)kZl%uI`Dj+~whZi5Fs~Sg6udnXbqdbm-rNxb^4zgm!TibSRq#&M^PVO+cY%U; zO+vSV1+2ZBI_6R9JRaXO5X8A>pMvwtu};BzQ$f9j>@Q@d_YwO(`YRfXDh2N+elc;2 z4=Tv#UBL&|D!3p=!3W2qM?tK|bFKE+i(egTY7Y6Ep1isnL-7ZjZpAe;y%mc<>?AOH&MYAqcBgw=ZW`xi-J}3{Q@<= zkPBwJG9TL&d~uV4tGEv@ZB=kJeN-nX_zL^iP~Vyr3cfl8pdyTcP zEeGe*RQSy@EB&vSy`%Zwy4Sg6p}yo;uzv0P8nYEBIEff*Z$Shk|b>q6Ga4 z)>3oreg)r|u3#Pc>KYY%m;9UJu~xzNi2dF{1vlqmn}Y9;1UcUCP_TX)$n!xK=&d15 z!4J9qA@{eDezq9k{MH$$Rq!K@A2H8uWeR@GHNFoEHs#=ef}d0>*gPJ46#SIE+lPR2 zpZN;zhyt~LPOYCGR&Zyvg1n{%zgVN-u2coTwaleu#0tF zdlme3y@K5nuw234lF_Z;fouhTC)e-v$os(H9|nl?2f6rOD){Fj1$)yK{EPK{ai~!6 zZ|>cpR0aQ`u7Bzj>}Ll54h8!TbKehdRPeuSnTnSAzXWv49I#C05$Q4qj*)p}JQiRL z4#^ypjD={Cc~m0G&?a;66tHh_hs>kXuuA5TSj@mdna4~-1&ALt0gW<`9gYkT``Big zLq~$=L-)x%ZW@|o4$H)Dna8h?8O{1=V(>YfIeZkB%RF(O%ouW?}@T&BZ%hdTJK z$qdg%r%ZPWn6HF8#wDR$ z<~hq`j;Ho>so`AKB+kcvnG>>Qp3h^xPcoCJ^@1@V<^`K%PNbfRIUv@BZS=b|U8hfr7kBu@@GqGJJughi{v*7)wc@@voT`=3LS#$M%nbYHCUL)kooI&r` z66;#}&uEf)9d%_60ei0}_VrydXVTY9?(GdDu}$VI?%|EZ&mvA1xo(;$GkXAb%e;B3 z%v%yrDKmGW%v;HGD>clfhTE7`Ub@WN>F;*xm_y%pu!eshV9p&X^REAw3Stz{d%+xV z?QUwid!NjC=37djxuLSjCWfi9VgW?_%a zN14N;D`b{YQ`ubXlKEH`SX*9#eKH@<1kWqjThTA`3Dz&Jk@=(nj!V)(txwVSQ`AyP zEtSN1nx3EDFLNoqK9hsPGMBObS?XIp9Mth#t;`klwW3+(^G!0V=;;O4ucU?-sprLm zGFS0<6>(lFm$_QVm-#ZYsvacsl`@%Ya%J*;k@+e$uAPYG=#%*x_vf_(GS~T74D!8B zjMte_O$u1^Mz+lL#CwyP-<*$5nHv&8U2i3T=NpN=u|wwD(@_oL)Q-U{?3DQq>)u%= zvu-ff%X~Kqvr#W|6W2D;^QLVw-y4Mj(Bpf=-ORi;)7$2?U|#PJ!~~RJyUcnX*O$rs zU?|A-0dYQPm)YQgx*Imh{BShpVXw@_c+g8D_jL<r>oH|bNfuJlKEK-=7KtQB!RU% zw#)o{EXci+96O6;e!=kzj=Q2jo?W|TewmCKnY_-MEyVb02#Ehxugu+ivy8zxBvGP=+>{d{1T`9E=K?e@sA)%$_uClli9wV)QbPUTXd;AN12lU4JKG zqs&7b4^hiMIiTnMDKh^Z0%mcTe21%K{x=k>6_Ss|3jNPOg+c?Ou|lCE;!&&6z#@f? z=v8Rw0)>uC!$F0HB`I`# zszTADuuq{AxHg;|C-VHnE`?%;g0@G;TQP zc^vW18HPgiC^VjPeFFVYC<)Ntu4 zg{F>1jY5|Z`!f1S;du)6@ZLCdIXzA*Qs{~(EK(>n24xEIeO!pY^$4ZWXWC+gt|InT zmFQO}eHxhY)f}&;zv*ifx`xNs>{V#Sbo458Z5G-U${;4M$D!-iDU?af%o2sJXO7qN ze5Q|9g>G1(&@A@N+N02o^$KOBqe&tDJ~VU_{bZ9r`>;a%tw$(_9&*TY3psPA;($W8 zQs-=DFuPA7KJN|X5%2bLaBt>N^BoHm%8ym(PUdkZHO*bG&|N7C6%0dzLU$J`G%sGE zdx$-Ms6zKLzd~v(>{RGJViqy0`&TMdOwI>pDYPI>p$A!8!sC(-g?POUJ=CmFDfN_Y zSLk8lK1{6(qmT>geIyywxyS%BSk$7>qdus$Y#i1q^q7NXIHXYdZ0u9$ajrd1-U{6(Dl|rwiDzt{ZuX65HYF}Hc&}(rDts8(Qg}$lZ|81qtM$O3e~Pw=$&;6)iIwlNBU4_lb?mIfSDXe;@6eGF~o9)3h#zCR3oM9gg^3h~+)`j}cjrp_jE zHF5kT9rV*Y2w7m?ryDeSpyf!I&u`2${I8t#psoF6vv}lWerZo zK3PYnqfOS3+2DB099dB_uvgZxlh7$^C^3#(A#2!3RLeSk9Old7-(^@Q48mer!=u2u z6UTtKF&ku^M6MA-u}Rj+v(O`JWVx(UsEhZz)+lNnwNlopCOD3Ez;!-fwqiLKyIj`k zsZ$UDi1~K8HNx3uK); zURGiZX2?2k1Xju7b<#S242YMsN7e=NuvON?R9P2N`-RkWVT-Iub7fsbZIjtQxnI`B z2V^C$kafvukmHhFvZe?~dK*ZYYCxO|tIwu~b%JELP#5toxYPef6@6 zSX0E>`-yu$wcO8)iYK8*)&mPfMY2knODTOnJOboUkysRUq!N0?-?;m)5g;WG$!HWNn@V@@`%adVYT@xL!X1)KyO{^}VwAKGynx zc{N0Vni^RDVLZ70VY9482is+BA;*>`SzAri$@(Y(HM01=*4nmP*2k>>m>!$bWPLIa zOJ(soYc*5%r>yyOtE}x4L4BVw{~aU1{?DnC&ylU2+hlz~j9rOX0G@w26f@8wt7Q)8 z{i}R%?W;anyP3ys&V4-#hh*{o()wm1xVL+UW38-jQ)IPrZ(5nbcjRm1`uCHuQ`SD_ z@dGn#Uo7j#(WsZTe;kI;oHMl-4iv zWp$B{zZJ569fkrhL*83j-Sqz(xqoAJ2NJMa*6%SWm37bpGx&qPdYE0$0$G1jLvI|` z$@>Wgj&|_F&cxo`ZJTN6(Z!WEi%}K1Rrq z9W@;6JC^gu=E@#A0!w8dHwBA9&S8bJkDrEq+0g~qEBgf2^7l;kaQ2>km~0^(YjHsK#mxEQ&9ajduuAqNqrh=WEa-g-aW6HoTK3dmUw6AB+_06(pW`i6z=6KZ0&LPJwgFs!m#LwLz`&Q!LIuFcub{rOApX}S1(``Mn^X8yV_U+Vgd$sI2 zgE0+FvhQI19jj&MlP{k$J`LOZ%=hU?#lBvgU2K z%mwQf9G3kceLvVQyQEb1L#%&@{G~%d&WBy>mA!B}x@A97CVLUr7HyLKD6@H#dsN1n zGHQE_+>iCiE?*`4@d?-{yCN0MvY()a#lGw(>F-JUUP2v9x@14KPIhIE?59&eElXF( zekNP?vJps@{p=_ZZ#i+Eivn}y_0)cz+*R~l#rdlFvR|-ducWS(`((d374-1pe%Y%G z6r)@AOPpIh7FDuePC~8hYT{HEp;z`RTV=0VD*IKguT7Kv+5qq~@LIp@bq<){>+x6u z*49h{``#!;tL*j6aXtOKNuO_4%icf_8yaQ5MSpJ{kiC&Q-ZrsYb}i>>>HnQd+58&= z``sa^lf8);yl=JNYnRRIsr~*8+4aokg9)-5Vr73w%nuLCZfuslg?(FUWpAaIt@$`8 z`=de-cUy(*k4Iyb>?UG!Kpc|&>0a5}%VdAXY(Fakv3BI4MfT_P_j!Zto#fj& z8=GW*!MQK!gU@2^UCU&D>4WuO_Q`Hp4r=|1I=^D=ZffE+(*Bz3d#H8KT(It&)w1^v z06+KN8X#V4f$Z|Y#glif8>_OF9cBD;GesDbyF_5tR3fVjW&Gjx#rf0(j+ zqER9H&)u?n56S*(5y;t>f(F@tj{tKzREk#F{}AV&jk5dM+fPp3Q`-NM=PvM za!xd`PEHJU#LSg*(hzKtGlCvQERl0^5-Q}3%*0+fr%VTRk0SS|emSSkm&1EaXLO^S z)7T%&{@4aNr)S6+BQ(o7gMQA~DrYP)0*R=WV^C)>SB^OrZE`~M$KiQ6 z78~TaE97{2a{Nj;5#q*0ff=01^)vU%iKqUvmdZ)s+Syz?n_kD^oHcUBlV?1+&*kxX zL(wN^0)3s&tdk_?f`MRe6IaQ(aG#t>`{i6j&dKyNd8eFr+iIhp9Z~{iJi*0XZpoaxN#|61bjOBcBZ+`K_fP9pZmxrMm5?3Tl8p_5B)-itc7vVOJ!>X=Pm zw{h*Z)pGI@unzrlZZDNHhk4B*)*bO!h*mlIDIiDwVL5lQ?@oG{%g^)NCOLP_K!==y zJnWKlcLv(z%%hKc#(-G!d3^6IIfa9;R?dA%U~f^joco7@HTM&vc($AeTrl4SQ{+5o zf;p9Jlf!G9Q#ux0dzcw7B-SI*C_pp%&STX4c#NEiAy^LjeqsTr zZ!z%~@0Ii9G_ZFGIi4c!Q|#mKh@7X%y_7ghH_3Ts61K`&Mz715$FtRPmOCKMb1UTV zy5_9l{PX0inumHhyskMfbjw-Ex|PLXHZNv@epZ#rd5OASYLT;=dA&?8FRzhP&Ah6s zp zTTX2a4$66l=kF}WJ~?&cz@B%@>7^_IbT-DX^BIpoUiEPEAs6w z1o!Fd0y%qFzh{n|Z_?!K9gNj-zNL?EnL#W0dC%v3w^UA>1#14D-1`#1{CNFx+Q%Rr z%;`tY?;kGbCuY(S1#zO$U325pNiKdF=@wU!-ufP^$0=98X~13Ec`0FTfgwPs{`HW9Fe>;giUB(td?U zEKvC5$!Jt~?#_&hhk0Y*Tm)xyS5L znD=VoGuStFJcu{8S>eD~P@@rt3UnwOOjp>9LZ-r@k=U)Ul>l^W#tc-#_&&#{n!9SV<61wEcS94kToL>?zLDtz7;6e~O-2K5S`KLcA8PNIejqCx%( z4k@~smyIE z&o3K^5`|L+qDJA%r(li3)2MYCJ@dXVoSK9>g|FPCaGC>ZzlwcVH7cA=4Oa`x6`sy< zdJf2W4L=XO=7nc4NB*BP;cLmC5eJUf5j%4znBVnz=uvoPslqoHXi<39M9|BP#L5}~ zX2$o2;hTt+ou=^3#Jzci!Z|~*Na0&XW39ruSqk6EEN(rh@a$+1^R{9%E1btMZ=1rm zXQEHxIYkQJF-770!Pu$ro!JV{9k1|R?7NG43RWw8H@SFS3(sR-_b{XRa}>TeNnu{o z!i7r|zHbyZDqNJW@cq2UsCB_&g&&-)a7nVlyjKf9v{~WO0}4OPk-yyu zKQdKe-k*gREmio@JqnktQ1~%^b{^w#IW<2{tco$<`4ilm#nZ7{;U}s4$ttufyo9=* zib99NmE?T7SmCAgv6Nb#nGgC{R;ci^&&?w5tV3Rl-D{0eoiA=aze3a`yn_%#cM6kgY+@aqQ^uGysU8(j*& zNu6&Je*@ zSn~tDw~xmGg@4?r@ctBqe@X=F`RpkU|T;bkqh5wq0!wUaBOyNV(3jbpu zAB_t4=P3Md6sYm=B8C6Uma7E0{~Le;xdSHRu-qf2V7uIbWpaf2$dvu%JA&J;0_n36KQ5Ndt9yO$&Fng_w-@l{1~o}*(>)9Y8^}du@!OyS#phmXpkFRCf7^^*F)uUtvP6sYfk`c z?R|2cX1QTz=hBB2<;GKYJTp6sniJ?bVVm5u>EUd8AGc8M zIh;F(TE_RwJs0PV!~wbI$H+~J!%Xa!d%-5T6IaWF>F8XjM>N-qCi+?`P<_geB_+aoulMecQ@d&eBP`NX|*p4_?gaaW_<0v_Kz8pNA7 z4ok34?)*t0_q`6te{Zkc!kKdKOOsoaDfj*qxy2LYJ}>~pSwNl#E$ot8!ttSDNS0gb z%YB&p_AvV%=GsE~d&EGE+(r3vA7%fe%&aU)?qdVNjLMnCXbprQl~{DfK_oB6nGg+-FU>%Q-IJFZa2%a#yhD z`6{_ptb3tX?#k)l+Kbe+ihB6I%zY^v#9TcBd2(N-hnI<6JqQJ8llw|6%H^&Z49>0D zD)&{^z1l2yZ5fFDTB_W2^tLVqd*r@Ojju1q0l769a^FalyM8E`$NF};Z+6PvFdn6H z-!ed-8+rUTG2X65pWIqvzcWQ{9doMV+`Dlok-Ld=n^w!^J2m&c4RSXVck@QM?+-_d z+DY+9=$G3%8QCZWKR2z^`W^YcWAAsfOffUgW)0G}H! zNCWfve!tv(%y?f0=3;}~ABgwEBCM6$o{D@d2G4&q!O!uJo8|6j-F{;2pNI8wc@1?t zsNv^Kxt*-(td+~>k?t?d<(K7X0ey8bn=ayYb;7#ev_ql&F??Z#I09^lPIx2BM zZvRx!53jZEzX>4jzpVSW8eBg-9>pNWf5Sok|CV5vJpNwBQyMCfe1_sH?c1Lp@#!47#xC19t#!8{+lLEh0qxx6979Wq}Y?=`(+iqR=A zDixdL9b1Nec|&u+p5umsnvOdlZeo?*wWZ9tYM8Uxa4# z$vbh4ycqJtl!9|7QO`*;&?Ij}IyiT7GFHnQ$+eNh8Mzki@=h5A>NuqgjiAO+^f8Jx zqj)}w=ci5u^_@x_-n)9EYvr9b1R2;UFV+P0#4_8{E3ix6m=TzXz4Fe82J;&`4GYmN zFJNIQxNgwDk&6y_CUY^@pkH2SGHO6vYdKow*>g}W&l!RYFq<&P@Dh10Io%=<$8*6v zydCoV1dx}%^YJ3|8Y!0-Hvse)w+e^koyok;B*vMW(J3#U-0|#*X9j0QfwgDVfwc(> zz&$$K0=ds#kA3pSk!RdCdFPA)F~%pN9_%@nYv<-;le|QFOeA*V|35w;?>yq1mkDY) zZ@at+Jf1+z^Qqzdjq;L)VG@{EQlGpF(yEMK#*wO&x*dVEtv(av619)+H|` z79201g|+CBH*Gvh&@Ar?u3y2mE9&K?Qco&*Qn@Erj+K`-2wY2Ju2)saOOL_^9F%wU zIONEi9*qWh*W}Ba5d-?1u@2hEgSAgyEGC7|~&ddYyu1^Ge zXL5aJCAcp)kmH70d9$cx)?(1>jpWJ__*uy!_f5l4B`mdU$w01`m2chcjXE%N4)XKp&^{jMk^V~4x~_7pIiyNNN6-uT|u zn@8+j>B6;&OQHfph?u|y9yh36XlK;MuC`XgLBI+&LEAM_2>*W;_uXr3*%6ni8 z@~}&BYAvI#$Ef|WHS)@dT~5sMc_9Ad$yf(^shEt7I4ti8);z(_@e`f$7Ei!- zc~4U3lil)`OaeVTMK4d)$g5nBL-L-U3i@4|gjMpMiASTnWyD&>@!2@cl(*bLoxJCo zRo*Myk5}sDt>O6^dVIAQ>{&Zs-fOYgByU}=yw`_;bv49)BLVcap2u&p z=FPeCHjKb>d2cNNGufDgWuW%Ana|tVCOdG8Ly6fDLX zd7G$pQ-Qqq$o<|duxB&J_v!on)z~AiemZzu-y`pXJkVzY{Wk2C_aWClWKCnEye$UE zwWUGcR$+y_kCMTRwq>J5-p57qn#kF-0Il*qS%|IjnmONGhjw|Nvi8$M^0qVI?V0G4 z_ZioBQ2UM)Fqh9qqZk|H?Tkh)n&o{l6)QolyEwONySy)J<+ZGm_f-_Q{#6wY$lE<0 z)V7;_UpvSG_hJuy?8!%~yl*CeJl`=OTG_+zi(cztdEXVu zYvX(y{kQS_d*Xk;S>C=Rkn;!X|ACr*=#|IseqQ?$?3DK-GuS^ECGviX1vULdP5j$l zuVaV2pQ-KVQjo8cn4Q$}%T!S7FYWTW*!QcDiB5Ul%#Y7cyx#`E0=fBp&pVI==Jop^ z?3Z`Y1hxJ#1=P`#hV|gup9P@b-WX(n9{-}Zzo@5g7+BlKocoyL-$n8c4FNSBD#syt z|4_p}yXEz#gX6!%I~;}CpoYW!^8TBNI{6xi3e?O0-x!o)m;3>vP=Ffwd~e_%!EvB4 z9Zm9&oP`$j${)nJLG!R({!znFC4VsI2Di&UIu8fr51EgC`NweWn9bmER1(M+MVw=! zkpc1?%le_?F&k^JPyTVKI4plyE_Ta5elj-5k2bLYwdjz40=1q%jNwtp!4ml=4hHc~ zoP%olG09kkPWdPKpw^Qr&>(*Vb&SXc*GKGkrx5QH)}2xg z>L2BR9!IT|e=2)U{r@Ag8O^%UJRW^e{%JhsI}AUTzGAs{`ZUnr7!#{Oe`lnl06agV zNB-C})W{FePk_e(@&{Vv8`Npgb8rwiA6z2e!#|Vx#j_`#T=ARapEVkl@)Ov1Hg%m% z&T(8jhjr(${+yli$Ip|0ZX6cLPb5}i0XE7%kM-wG2YV(A!+iPYk4Fji%TMBY(n0wb z5c>jZxu8b=#0hAUf8lTt@4_zmlTxq*^l%aLyl9#H$;6q=d@m-)#XL_Q3*scR_Yxl! z@}~>}GnukS{-pvxgO@IlKXn)u%D-$Vm{AJ-rsT@Mdrx%CCzbxLWc`&hQHR6w)5x2)9Q1Y-eO$%du4ss<1FgQIwb$5abVv~2juhj1%7r34$8mT!V0v>&tXpvHRe=+ zn72#?Id5r{pBsx(5bM?%*d%}UFl3=t{%ujnK!g0e;oyAUdil3ApWBP%&l!t6)XTqP z5Yj>3J9^~jJD3UX6@QQ5=Tpm_#J-a}cUFO#=MrZw*XK6NziSloK@E2?%L3{wAn)BS zn8V%Vy_-7crJ_#$JMZ4tR z&*S@Zu?ns7`Tfr?UW5+$4~ziMADE8q@)!7+jTZS2(({A#{9q+`UJ`>WkozHyr8V*& z-X?!xJStEt|B-><+9UPy7mdVXbjyD<0maxUzic$9=P_pT7&9o(k^lH`&_f05D(LwM z_AX}KlcTUo{t{-egji2SgZubYpZv^}L+$+dhIs&QEUbJVh81lG%cems~@6?In4K#TkrQb6vN)VXpQ z4#|IU0k+9sl?dkZ68m0il+X86KEE6KFQRQ_wMe{BNt!THyE^knpyX<+lO8%x8 zuy@lg`R_R>L$`c>hx9ko8~;wuf4^UTJB-%YOF z#Qb_HHp%DnM}JQq*z?U$%mDfK8lb0dnccU{<6CmI62En!{O>Gmm)}ObwlewOPXv3u zXEyuj@rMB@K!^Nx^0gEDM`G=tg!R}X|ED;xzJvSn^C;xX?~DigI@{#`G6k#9CBG{j z&GLWE26OFB0zLdjZNHUcpZo*N;rD2i$Uis%^!7)o{2u1kL#=ks}Ngp+%8_Q_-Nvkv^&v85E5YMUE0yD8grek-;k!IeH}W(4okX zOzctQm?ShS5|shYADaU54jqj$98%;s;vdJ_VL9khX zi7ra9SCN=BtWo5o1>pGz@}E2qixn9;7@R+a=coMtv0srWn-F12`rKwhsB?DM%Feje5;5}Ax`io^{C z^Eh(|s3|^Hk+XPw7Ih>rle39AjyU6rK+or}|C|m*#?QndMb2eUBDwh-E^;3AotK7X zicGLD8|xK0KM~9!DIV2|T;PJ5_}ncrF%z2=xsaMKEK_8X336N%1@cc$L8l@YFHt0! zc_gFD=1ZMWzlwI@X~}k;_U!&J^xTN)}j?Lfw~h{_-Y8rV(RW zp(0n1?~0Y^P$ZQZq>>|*{8tVFHC)-KNZM!=DRLESugXQUBK*x}Bz?0YSC7D4>`-L7 z1CH0w%QgEInUSo>wFAM-uH}3N_b-Dy*UeERb2yeOa=n2*MP`!c2KL{;aaJZ+f8!Wr zVXY!rJkF|BlohnP8>yJZNt7rE4(yF!s$Io`^;*%Lsl+hWkG zNFK5B$alMmMQB%q&(0!u5a*6uMe>xEktxi1iab)F$fD6G zSL9LpdG!B}O^TFF0msLtqDGN&dMqbTIdLAJg+4_pSo;Kfo}kyoLqM#>U5Y%(^(X0N z$y`OAqVA`16{%!hWg(d5(~A}1Gq1?fMn#^Pj4B*bWEuOPrKe{r6j`1Hay_?5krm8o z#WF>nAB6>2qe#_AOu|M*USQ7)#D1Y$k(K0L*`mmc?0K;WThXh?DrUE;UXhog!T!|~ zQHf4PUY>xJic~X~YHF_DtH>){e}&nW8HQ0qqS&)d}X_F+Y87b)@%vwCN>B6acL_%3-j z5ogmnMc#|WQbjg%ZSzh=-XDts@VK7G^*pX`Qsjft$OnBlFr$VQitu|&4&w8jYUFd`e!d2sitHQ*X7fdnBD=`DYp)_-P655N%s{Im zU(LcEMRrdBYrm%UumAtpugD%3?EPjG>J-^K616LO!$8fy&|lXW%mX!a^(pczv-y=7b(61~^}jK*->CNhv-y208WrL5t;oS0 ziu_TaNDnpi`>ehL%_L#nOLs4BZs3_af5s; zK%e4{%0rLh1{W*tXx1OSPH{t0QKz_L#(*_Z>FD}D#@+|OraJ%sf6bUbckbM|bMKw| zXZ{;AV`eah&i`|+5JJ)-{*ZUiIPPfe-*43CA$Nx6D454Vo`!o zSSU)!4`W5isfGihggXH?B1c4tqLVd=lG_&Mi;~w5_KA|;2lj|k&=>ZKQaBi>Q$!p^ z=R_%=vc0hbZM9=mx~zbh;=NwW3sVta6N(*w>VxuV4U16IjEy+X63!>D_5v3J*XoWBSu7+}z1K3g0U_5LP zMdg^fRupX*>=#8JCyLQo6q7PM`%`%Cr&ye~@ojGr#i3lBHi)klrOg01ABRd^#NLVX*V3*$&r>=d5Ty$~ zyBrjy>k?6}3&0Rjy3sb>mccPmuAd@G_i~^;Zouvh#9X^jlp8&;NR%GL)?fV|HlSS!M1!%r)mMDF(dwW+=`Uw#49W}sf|F%FL z?`#8n9$>(JQSRymD?}Mc+yj@0ayLHio+-*8Y!0IQJw4#CD1*t@y~!|5lpz+7-}|t6 z-+57nQttlYq71|5FzP;_z#dVCQ})4pSS-qjS{NnDL)d?4t0*JUKa#%o@B~pt`2h`& zpyd(rF?yCLk2VMFvOl7X!T)3EeGJ=U#{hYJd=RXM1EP$>?zoepJVET^qc8{1_2dju zCR6}+p6U)KM45=Dr`rH}CwXDHD9`YIa(_{tC2!30$`o??TrunuWh%O!cK~10&@%0i zC@+i^Wjb}I^ZH@{h~Y*2&ln&I^Sbg9WoLGS`J%j>0>m?`2Kf96anB}?v++55nJBO3 z0(qZbD<~;i1{sI;(3*_aJ49J z4-{ol2^dJw(Uo%7$=4|EH_*mN+u<;4GTt^PpVfWK1qO3>HZ;IiVC>zMrXPZUYr~!U9;(rrm zH|-Q84+!i!%q0VnTFdI&ZvK6gcmx}TQ@qIB8)`+r=^V^7L8@j*j z0~L?`x64J@9|H9MsSxn_r$eIf>`D193dDGj z@&{*%^5w4o;a9?mBT~ftSEm$(~%B9zhuuq`RgRuF3M5r97XrhbE5oh zy(q^hb8LYqe@}+?Fcubxa=ZqH0cHL{jQ=)nob7buqZ!{7Uh&9%1N`!lwFo(JUZEalJQ^I!d8hbZSbcMki%&<5wxalS7c66N1x zM7fXx?(1ezE|SlS#DDRqsM1H&q+%Ear$kNeFKQzX%n&st8ODgpysM_}7By|2sC-9A zP2Vf3XSk>t!(f4^-Vn?eHM2QT&No%mtO>AERR35}v!?^c1C$ST0_udKfbS4Cc@CuJ zv1B2f$dfL^}WqZSv! zIZ+$qyM%HjQ$%et3@(UTIuXu@TGm5!<`;{V!pfX2?F;Jm0^99Si4S8R60=5^HVMtt2)i+Vlh zu3ri#MD1?CbT};P4dk%a1L&`vA?l69e`8xfV-K`4|EfL6c@J#e)CR`GDN%cl7WL*5 zQF~FQ*Gf@u$%REg9KFZEc2RHbFKQn&_d!!1>fDCTzE!Y7)Z2;ecJ%kd2KVi1zYRd# zccASKwDl*~{r8A^C-L5i<^e-swWxPd|1N9~oF(er*c;Rvc8PjV1xx_)FqpFUV)tI+ z8!}te`?`ucG#RFddOv#ZC%*g9ct3WAp?w%Rd;pCP>=$)7_J{Wb&JSNK>Vu`w9Y(_f zQAc<{0m?sw&XL7{-;w0!VK0z_QME8r)JF!1I@$vAI(na|k7~gCG1z;oGoWuQ$Hr3k zagL8OM18^s_NxezK@fQvS(9qE5iiggv4@HDA<;ZB2(KGPM> zi#nP1n#{3h@jsH&*Ioyq%|>qULJ4U7|Y7CD~PU({Ey_sT3$XOp|x#PzBG zam*=!oua-*eqLKH>RkHFT-x__Vt##?sPi;9E9x8PMV(K)Zw`S|qAoZp>RY{lV++aW zLi8-;J#)Oeh`8Sgh`KlmL*byPzZwbHSib{Sz_laxy zSW!PHhP9%u7%u9EVL;!?siJ;V1!(#hJ0GLr<6WYzCf2$(fQB^-Mg29l*7{+#sGpF> zPmYMXj(9)qBkKBUpx*kKK(2n11{z@dH(N#BPy>|xjN_jThB>eSE{M93I-B|ev1~4f zA+Q2Yi~2dXKR+kxmI1I^)ZaD-a=0}g+}E{mP}DCt{{?=wIWP;3iTdSGSSsrF5;!U9 z?-q!dtwheuXaPbM+6&K$+b>;PvYi=mkqe-P0DR^G9^=#qKxc;T!U> z4`1I-0yOUL0mSpCRlw_a*kt}z+4oluZWr~>6Gc5_0J;4hd*7cD^)CvL+ar8Fa!k~} z_Jh-+9<7E^fbYM}1oR&x|HpQU`gd&neX*#=!_Wyfi~5hAqMkt03CjK;Fa>srdUB(v zKlTM|o}$iABVmQ8r}F_@|J*9-nN_0xjE1w_VY;aQ@<2C0&pC9Q!|%DdK>1(r`3pJw z<$$Q?4~zQmL!w?N2aa8=f+eC!57;kS(i+i{rvmRAb%hh6rD!k)7Qq?OQai(J(b6cF zUIHWGyl9>gut2no0E`pO8wEal4~Ul83)YL~tA&N4Wla*zAA&=oWm7NUfgPd+M~N0n zhQp%eIIu;u@BmmLTBHW{i549Udqj(&Beq<$+)jYLT;j;fhohq9ZxpQ{7fy**SPIlB zTngtzD;f*iL@TCjG5#8-!7R~AQlO`3O*Ft?DW6LzTZXSYbPKkEaBGHug zKn&bFYbxb6eCU&5nP}|KYi4gCeru3ucA;nv`kBMEIGW=pL~DbdHrT&xhqz=N2FlfvtJLHqleW0o2l%;pxoEvYfQ?(wam!pl zS8tBrioIK>iPontpt%orZo}_w#LySJeX)OgXP`_!Ui)1T?T+rE^)G>wqTRU|PKY*O zj%arc1C9;kb>IQf?w$bn7}Of@&77AARP&)1nQXDcb!3 z*ecqvZg5<*2d0QN92>)ri1y$N(MGHl?V&cn@sW;b4`btDbdN&ID6~8>9L|b1dLm%+ zQT&ae{us(Uwn((G-QlEYkN1Y1qK)eSvqXEsFWUH07%$qBe4bzdzMdK(+C&59i}o~S zo*pUMB=R+B0~{0W88lBOH26DK3SVONwnuXi8if|XzYD!FQA9- zernSXi}oU)UnEyE@G)bzXfL$}Vwg$&mwEp(d7I^fp`yKlkJ-GRy+gEDXTxdH=1`Bn zN2#Xj$UGX3^da!z|I3^15`dXzvYygQ6|#0mnsqzb{-6 zZTT=j?+57qfcGo#$Gobo*dp48g|J#Q_OrE>=SBNyxoE2bFaoIaF?Bws>}n5CX7zN@ z>S_QzYxulom1w`Nh6SRnCFjh!+9$<8em~hK+B)j4qwJ?>TaVrK=>APtpp7Q-QKOXoDT-`8{@jPu_Nx!&1?{LjPCT-c<J&2x0if;gPm_UzON4)6YblPK>7V+fp+;5$NzL(v;#Xt z`;NNbq3IxT99#&eMEi3MpyyB&i1*MT(Y|j3i$pt2oQF4y_LnNyBHEGOa9Fgzjsxl* z#m7->|Bd_}>jhgy`+F_y5$$+qm;#*t2fj{pf_Xrn_<@*y!2U_fo+Nia;`>Kz{D}Tj zb4B|p4aUQE(N3f9^cvCrIYzWI)H^d%w4d9;V$s;A*8Y_Y>)@Pd=O&Bxix1Foewb+g zo(LyIyPyG@FB}x@VsqFhy3~rEln=W^Pu?ziBR}jHJ*5fYDC8C$(zbQVOZWO&@k?56$ zqF0ftss*AqQ-Bzo_ZGbcdRlA|y?U(ZExQ7-)L^d_v~Dl@RTD&4ri-rj6I~-mI(arm z0d~z27znfBfaq2T#=~ORC%TOvo8!(-(c^<*m*{QUz#7r7M$6ShVWsG8Yhaq_?TDdW zFIWNSYd=EtYm$NT9njX{xab|x-0`UB+(YZv65qAd?~IPlhehv#->w1JBl>ltMel~) z>%)M(?&Ru*{-W37w|2MaH*OWZM`ys#O>;!=iQSv2%Xba+Uf8|`Ew>yKy*IXdqq8^V zd*kEQk$|3CiLVc__rcd~Q$+7ex!d#Mi0J*!iGIg+(fbdB^P=Cm0QfwBG6N>S3DNIb zC;C9%-_5bR&x(FeF-#JDFnPW=1jI4~4MX|>{&-%k-`5>DK9rb-j)DuK-;a&^iD4KT zA0V~|wunA_wCE3_b3_l(ADSpS_qY1Uo-iABivF+y3q&7~4`FI*z}+nr#x=!>F2 zxp#L8^pAM`XrAb+u)T^re>_g~)zzZcVQY;e`mcwGzBUXT|AhAXWCpB) zbE2;+g^{9vij7Z4iN2mV){lXuuwV4ww1@eC-3{2;uub&O+Q4SfH{x&O9N_&X>};Y8 z_p|!v`7llNE#!C00-z86HdpkmeBQc5^e@VR-z^h;2RfNs zb?#U7uQ#0fK{S@ga2>(!7kDF;bY%Y(ZA*V zw`1U>==(dsdeQ$>1^7JBU-a*aVT0%g@y*|N(Eq$u^h2{n|9+V0hsn+1BclIhs^~}h zi2heg^rP4~ioT;KME@I_j-^3&ARhLab@rI`#}`>;&7y5CxWq!F*~Y zO%o%T&&lJ(Xw)3`ijgu)jMNfXB}Q6bI3PxP2iPr!XOtKjVVEz5S73!0nH=*K!U-|5 z`omc<_zs$pJq*r?5tt%IFa;huPN5L^MTC|3FVpMxzC~Od;r2_}WV6HT3W{J@%43uf@ zg%NOGjH_0Pp;W^WG1SFkX#L=V82SM*3^bZc#IOd4VH;vN_=uw;j{f*`G1`!yHrQ^n zNQ|o$Anvxk#b`Gfh_`)b*eu31#NELHj(4npwy;x-PQ=y;?bnVIqcc7_uMnflQZc%c zgX_{@5TLJH6)XVsUOyD(iNW{8jP7k&io?2p3EBPlQvPKYtO z17P#fv0{wD?ig%5Mm&#Ej=f-GEcM3rglRyz$IM>Lh}-0e-|A~vCp2au@u|ywTBsEEW_TizOY}6_lLqhF_xoq z`AIQ8AkGgcyMoUj7Q<;VR!$V-qqcy}Rpfsa`adoO^7HXAF;>$Ct5=9oH&u)^QRoe5 z{dEYs0Xo;B`4b;#K)FxQxvmhVi}7gyrojd=*5?DU{3aPDz*#XikYo0KjnB}uk=KpX z-Bba~#MnF<&WZ6kZMp^9TaJkF+mT{y?Igw*9#|^IHgxd4D&xyBVr)+V^!#qC7(053 z@%tWP?Cc=MSCrp1K#V^)a7v8bW5xKISidH=uNT5WF_^^aZ%2x;pP2UdhLd9aX^n|A_t^b@ix`JTz$!8RqQNmSj!^fnZG=Z@Fbd9!@wW|P9K-*y3u62oAAjF0#&HG6 z%|C|0elbpP{={-Ieh343IynhA|Km^~Kc~9GOfi1Sg|%Xw9wWv-iRH{-I3UK)rGUP( z77*{h@bj+~V(?uk;~aVTWv&?K%K=~io*~8sG+v|)E^ZZ5R*IQ4RLtbAuv^SVRj^dd zl#yblR*0Ea3OmG1r;H~6E5yv`Bc_*fnbl(YhQMhtvpS3E?;&P3<+3TyoM#4W#SFC( zGiQOA;fZiY%qTXZyyg~*nMd9H5Udun;Gmd=d@h_1oG9A2u1>MSII4h>w2k@mCFiT9mr3vVZE4F_kiPKwxxc%62N}@@nT*xNX!miSSw~n zj&)ip=C#CdZGYG#N7!K&Z4*%Ct=eqM^b{huE#Js)+CWzVH z1Ngfk3M<5{rCx1cm^mFKb33u!jz;D_v)@56??6+3FQD9ia8u#4-&_SG}tNTLz7{hm?P0KawOpU;m)ugh;jzj+ww8i*NVm=uFG)$N-=2Hr65OX4R zpY92V#GJH7%xBO%IT!Hz>^3o{z;n~YoZ3dr=PO{BnA0|k`NBdmr;iu&#Svo87%1jT zC9qq}ncc;FnfEVKf7W0zUlB296Fc{T=Bo?DoU=^K*U<4Ad76uz*U|F^?fym&G3OKW zn|;JwP%Y+Ll;MH!<)`()^m(_V{3?n196nAF;8w8diz^lV`zhu^Q#WC|EC63g=U1iUzC|og31Gu>M68V7z%g$MP|tfvtW1t&t`W=E8YaM6v9f&72RQC; z4wGP`SlRf<=6&`lu>xbn3MRueu|i%zPmTxpoO4pFFy$iniOdiyik|2=v10g$Q7$(C z^To=mh81Gvw}tIu6%2uGVik6WU1Al@5vzEhSdA4}DpmVqL@e4*7ugjvV8ALsrM*Vs#?loo2vEv986>wb<^=Yv=7^bs_#PtHtU% zSgh;3Vs*oRH~e4EvFlHZ)x8SHOLy$t&>9wrRZH$`IaZ6l8+*Vsv3d|s5A5AUer}o% z=fvu{POO_ph}EmJShx6rxNo74^v3tCmRNn(h;2LqR;;^*!UeGga_;W#fc-&exCdYNoEPg}k61$jV%=9E z*3dMu?#~76-H*Ou%f;fmxz_N#Vm(+6w9SLmA2Ar_0(p3-7EX#a5-lT-i}f(aM`3H! zB(WapAl7K?kLK8D%09YTtTB{(tdCe@+l%$M%P2S|*0_GKP^>4=z?@}0u~Mw@ydRIw z@zce6(g&1%a)Vgxd0G>AKjDyAPfZ52P8=!L)A)LtcA13zN%)_Ho@e^P5wRwZg|lK! zq3)C!Vm;SMtf|jP@+l=jEy+rw!h+*b3v3Le) zy?k7(S?J{%r1i=?;N0w9Fc)Z>S1X`5tP^Vvb?4yowGyB`URw+2#hQzjxw8QKuPea& zdDNT7`8Nd6^9H)+YcN%;H@z@ktOY5sUaYs!`WBzx!rww{EnFtRIFvA#d@Fm?_+QIHnBdS z><4?qT7mBsbAgHR_?HaN6FA(cb1H?MeMy&4!!3DAYOnishi}gKa zzCS3|VQl?nj95qZi}hD@A6+lj-|%$|{=QGF<0r)WM{k%7XT>_9!Dg|3=meBKNsdlZ z_Q$beor0gx@zZg!PQyPZ!Wps7P=|d@>t`RJ=`32#t`+NFLtvL!=ZN{-VX?Spv-tk3 zbsl^F78oejg%F_a;ta8+0=9~sG*#^6YS<=rqvc|!3==!mFLqi0MvI-^Lu`*Bc7}+} z+-7I`#P)R)J8KY}6Wf15?CgH9QS3k`*dlh2^1;PovrlP<){31|1+&Bs_Ypfn{m4PF zqZ7oA4HP?95jziid2__h&xdJnOzeW*uuJSh{1omNyJ(cy#UlVejVa%FzSt!m7!N1J zZZZjWi(MLmp|DcyvhJ`R&Wl}6xu#wi1{cI;9>6TcpVDr%MC{fYOo5$ZUzH03V6)f?aVcZqxY#POYdyu*{eT^vc-dsKO+K5m z#kM8_G%69P35Qy(n`_2`m)5H$HpM7yDKNc8T4m3W(*l9)Qoj*zC*k+o!_;vHM}O zAIJF~t$hc1x`W*I?*$vhzH^e;1Hv#@?7RAkJ+Kd)6#H&+I0$`%7K?pPb66twVC)R0 z4&T?Y@0|_D#2!NZA^XI>Zy?}vXa!LJe(K+UTXw*pChcVi~hY?8l;Fj};gt_Ty-O{JhxXsQU!v zpTN%eTCtx@0W?m)|Ah5oKSj=-IwbbQ9b!K{UhGMnpM>9M$kj9GoQ$n!+rk#Hr;tbf z4LAEaaxv8s`+4&4JTXq2EA|UMm?ZY}PGY~943uZz(|!qNa&G1-v0ujitTAH0Lj6}x ziT!E-mWe%wI9}^4_FOd2Jtp?+=$VJjH+qXbAOG_&i2deju@_7g`>pO`FB~EE+tb8e zgspeBi@kWO*uNsiCB*b@2eFspbLk$j-y`qKXzOLi#eN_E%g>7a!5Ohvpz%XkN%@bk zwW?g~kDH6V8V%gn*=xFq&3>i5cCy%?koR>5#9p5w_HW4T1~h&~J8i_)CVXu|(qLhRqA!9XAf zJ6Z!}eqRpz#ooD4?5{Zg6}ETf!y2*wfX3aN-_854N5eL;_xNFp*neCg_Fgo8L%;b3 zANzWV{VnJAV|V{XvHvtt>;q!}{okz@`yg8XTnfa(cU|o7lYw%7!Pj4=!(p+HIB;I< zzpfMeDET|evA^{Z`&coo6#MUmuvqNl!+~7?W0BY=u<^q{I4$4dSHd z!!B_=gT%=wh2!FQ*Nc-`3%kYf^@083WDOU`KUJJ;`~^nB1#yBi#0hnW72@Q0VTw3m zUc;0LpA;vuSe$4w41_h}#3&oXe(o4JB2HdUaq>0TCQiXJaSAzJ1jV_4k7D#SrhenD zun^9OQ_=?T(}Xfjh_4B8HQ6pssUPrDx=x(33ZQ)1DRIg>!92ik(>`!QoQnD4R2r~V zoT?tMS)69$0Zq**)1m`x5vRHa7K_u;1LMSDFVm@^eyf$@w4N!>RYL%~$`Wx@>}e&y zIUSqEXmQML;#kRWRveq-4&~w_#c9)DoU5U2Ih+xv-Fi4BPJ0EWz&UZQnFz$+p%~_i z(-E5;w~Etg7@Qa9+GXN&?kP?efeGStZ4cYUxo)sH-O|LlzAd1&doOWr7zMM%sVxNR z)RONTt6`BiJ)(fGn^FMHH=P!zC+BaTBu+1m-_lo{-sHOXRB>)~*)2{V?DVOHd4T@g z@O|4X*d-4C4ujJdowt*#+h>T=5B>dSigO2fxMKwD5QjO)>Azl_JJE3GcyR_01NU#v zT@Gv(XCUYK{-|^JI5;BCpylG+Gg6$v%>f_xVrNJdToC6zVjen7ocqx}OoRR6Jg`rk z;lwo@?ZcM=wjQhi^o$@kBPPQ!aUR0YLrcUN$+?kR#Cdq2IHP=ktw$*L2=R^%z!Y&F z4Z}`x#`K0g;_#f#8QVjg$Nhkhapd3$a`?nHamKF}=Sj3rAb(F`>nZe1>;`+qc{&QS z;J7%Gy25&Kp0VJJIFs@BEaljXbfydz=Q;BJ9JZz&6X$u#Oe<_K|Kt_Jcpi#oIRi1SK6I4sU=%DhTEug(Q@%$YCFYqh}Vxenm( zb+pgp*gW39L9FxfH6IOcP7r4SxmmD9oVU=ikmGMthkGz*5qWyY3&gn?UB4OtYsFbY zyzh>Jv*Ij8=TdCGw^f{F8^n1Z-^)4oK`EeR1;;+*{fD&UN_>2@NSsw1Uya_?_^2Z% zb(7$fIBU8B=YG9PoV9-FFU}`b&S>Fj}!Xa^f(-sy3 z`Zi#D!(nkgBY&SA6lY^EI4aI2V%)S*oXyzz+zS)noH$#?z-e)QI|TT=b&5D&VEc>B z;%w^)7sUCJ+;3km&hIF*13Npmi^F{9>>LEU#QBPL*_8$}#Q6htxDRu_P66uvu`A3J zXD`S0E`U?wd{Yib#o4!1oNog#8up2^zZ>A|PX-Y4fet{<4v?eoDDxe8I#>(?;e{C%i6$17l~ zIR79gCwc(3ewZ%K$$8@Zh{jVJ#Q6zLKXLx2UE-WZ|7m=jJ|NCNJHv8u&O~86VE^Y@ z!1q}XVE^n%asD+$oO7LEn>fF8gM;FnpCQh_li`p!7pQXqdl$D#T-HcDDF9m}p1f4z zjl3`tmP_-XRjtEP*8wXAd*( zn=SDy5A2n=f4s!AyTX2n2l`7qm=8xJ9vUn0oI*G(@o+CVA@K+YIU*Z+yp#nXX#9cW?;#J8&UYhw}qr{sNXA9zOu|ne9>&07=gO-~mUegDt zSHpYm`{K-h@zw^cmH1UPFbPgdT-hyg6<<2JH?VCSlDOFyux$~SJqnfpS{*bv%OxHk zCh<1KutVZkkC%8`^tQ!ryAFWOYXo@h$ZMw!62H~~;=Yz+ow3&?4fxy@dtJ{-{JOR< zL-_g&%!C6Hzn=VEKN-kj_YznDTP1!2b#GWI@!Bd_CGi^rfbSlZ>4A-#_>fyHo4;tyc!f$4Bu;=?&U{IJ9yB=!f-OMC?OMx2!RL&Jf3BhmSAe~FJG52L0^ z{E=!HC-Kqv8jZb2OJRV-$Dm=%6p25!MB-xy!a0dQzE9%gu=_+OiH|P_;&@U3-4kfb zr@8|+Cia9`5`P+BPtTP&_h0czy(RukGPtixB|g~;{eXNui|=PwOMD7BnnL~O0?-Gr zJC(Ser~dQ!WIl{f^8>nG$OZIFr|qX7l=zGIevx=*;Clw`|569w{LCQ|e;KVW?~(W{ ze7{l**quEI$nC2eBtB=D#9zbrYiA`s7j3T-|2z+H{tfc}26pG~lK7iwU9eo@Z>^O0 zLTtT_&bP6ha-+mQs+IUE>a1EV@sB6Kc8RY>UmaTOrbv8E zNaDYC*&y+?*k8K}PDuO{Y=3f4;_I;UX)^4V_O{2lg0iEK)gRjRRYT3Km@ zt{JKlZJwQ0knCyr(Vl)c!~OAignB`FM0#JgoK8h(mg-Nv7V0|ir`ZgO{1Pty_2f(AdqOE1lY zn6fYaD38lVDU>Esf&ECCURtR~RlOz&{id!)qOtUf%1CiiBwVSdMZ&R&p=-6lqF`Pm zFDDiW#&SHNKtZT&v@+%|D$Iyv8lFfX5N#BVCV6r^Nt!pDUDmrMB@`^HX%r4fs$^Zf zAY0_uk|{A_suUHkiA+TjSu?eYvQqp+RmCugH2r@$mleuM{Df?;HzV;o;GXc{+?*Va z^J{Z3gJ182qQb%=mq<7q2}dH=*VX;kAr8BF@S|#ltd)EzmueI>v|c2f9y3feEj?CN z+0dpY@z+a?Ro3fN!?9Q-R#Bam8cPqC6-M$(3W@?%MOj{7W}B-DLfN_Z#G;{SG?X8$ z$%+<-n?`fH5v&QB}!GbZrlE()8^-sJw#+AZg~_#OWzmtwc?*2U7&%M7z+a(Z^qlUm#;zqG6{ zp~8`_C}~6q%y`>6k%(Kfek?Ukc(`H|DVIi&|MK`ra_h<+m-A)b(J9)guCC4oCw}|q1OquafnZL*Rt-PROB%PR=3ib+k|;iI!v_QQqcUAHNtJqA zG^y0rI%i~Vq$sg=S5I(}qzK~}&Y&dJIx$}J2Q zl=Tj`D$4i!1HtS_el$>0+%(CJ-ivP6QYot4s%43>sJK0@MUu{l_%F*hwJdGYI26l^ zMq|0bU^p7|$HKl?Nq*sgw2HiHBSSxxZgb&(IM={Ol z##V;ZDFxA9H^&ODN=`~m)0#DF7Jhteb+jZaqdV#XsC$xJr-3apiGyrd~Ev zKLFD&T?%kDD#K?bC;Req3ybp#np9O~H3>wx)C2={IgPqSit>v}npGNlpGa0XKN88w zaq~$(#Y3Ij4?l9Rm67zaE_aUZyf6}ahfKIvq6zep94Qhmh7B3VvH73TUmv48(+%h6;1?@^XsOv!Yr2L`$;s zX@u;|pqIE^znA0w$jv0FzdT_in%!(juIscQ!)GQZ`3iCi8|UShR#o|%1ftRGU@%D7 z(c(*Chy4vsf8WHC1je$m08h6XXfn z!<}EMxy)1O$@XVQJ$d2W0&nB=ODXVZDcQl?Y@g5X4f*mS{&1l$Gr8i5eE2W^ zO?J|s*ssLTSEkdc+moBFU^Dtmk{ZT)o>E@aw0Yygt7DDB!Em^+NjN7Q zu8YM=(~{E5bBpeCN5c&rg26zb;fnEcVuUlkFXw{=#idkC3l%hN-m;=F?9Iu^Z&F+o z$P1^pYE^xeH|(t}D{tzyt*dVV`aH~!@(~xoL^>-Ym-MKWEn78@g}D?qu4~nzW$U+J zEH5vo8zd!aj-e)30j|sLOqF2Fop*Na*s*I}#0pczgY_CinWw z#aCBf&%HSoyE*rkTk3AOfl^*#zTt8yQ?H~{dL(v3$7qz_tkjpeuJVT@UHsd{-_sl2 z){|!w*W{~{)Wk54dA(U#vHaZ3nsBn;U$-i+puzjBOLi;M6W&=r&dRq!u~^sqYi{*l zSJ$s!kA{+N?otyuCvkbPu5}CDY`E>Qg)>}W>1WZRBtnR>0>v0pNctc%DLGQAC8=ex zq$G1eS>S=XS6-=mFj%snq3%NJvQGY}>_3$&5WTRVFBJ=JOG=KuS{}H&?$sutLA1U* z=PdvKo5=&so0hj|QQoxqfX)4Elw@}^DsZQ9U}Cga=dDtFhpmwM8r zF5WuUvZSQ6NlqXy5{ZPnbg3&SC}Kev#t$3;DmEq3haf|67&YB0grp|EOZQ*{Wf{wMc3mt8P+Kt`t-k zAuA^q?%usFKfgSyXZM^C!;GxD^T}iMPj?n=n3pRnDiaHMRk<|Sijx!FA}co<&Ph)# ziG+&s3nHFKP9Tt_2TO{J(xP5}w$GF5_vYqA^1L}2exE-p77NDQ)tb9%n21WQ(2SA9 zSgMU_PihNUv?WOl|MNJ@_^hj+ViKLuT_IeZG_SmIHfG^9(sG7d+VddqAa!_%e^{wbzaldv_>9QbEATJp}YnK2PvEDmUYXuOLD6uu5XuW z-ji48O>UH$msgY9I5jo3QR7(a+``n9l+?QW%UEv@uX`jIEzEqR?!lbGVpq5OGYy-G z>q8}1OcXF0rscP6nQQBL&6?-xH{Lkl*3O-8y`=V8O0yEIqZA#eQtj9x&x%=jeeW32 zrSn5rbjR%k%G6&=>Q@}9RK8XK4$_7`UOUJpi-!<4CC zQ;#BFF?V&!$gjT+w!3n%Ta;9p?&n6)ZF&9fl%(u}oQM<4@&|J~(P(~dEEEf7W(IR| zSe`XcPV!`DdxO4cZvT!+N&c+N%y14~qV%OH+?|A2H?TfUccTnnu`IlDVbn4?HNZtC zD?e6L6k`?5S}^gmsa0kuQeIY89xBMs&yN-tvoKFetTuI zgNlj2q)B1Uq@48p{JeZmI2~K%ZVucP>jcyV>(%{dDp1`kbXnyU^S^O_l0P9VFFPqI z8cK23;^+&7!mhD!*xb}EwK$fKLT)kYEssN8DAB{q+!S6REgGp*-Al~4-Z?pp-&kR3 zNnUPI@3z_5MeSp`-f%{FX=z21qSX3TZwfuAKdtFT+OWb;toiCM1}FrjMu|@CpFk8Gr&aBi1pMa;+!T;=^1UY5=n1Z!?@SDcvAfo?Cx;5E9HjO za^s{cE`sToFNdULLY^lt>PgPb@NyL>EiK3|_62hDW0~pcERB8cuRogQ4+LVd%;)?_ z2(j*{QGPt_ZHI^6}CK7GZFh`S-SVLOYX8D4_SXNdb7z?E&`SOc1lCp}TQ8z)+?)(`o?DAYF5{o7B zbScZz5_A3)S-xbgKFO}3%SonoLyp}sGZ|g~pZDVaCI$JWO$rK{3}65zey%NTTG50h zU@1d5KfjxZ|(B$JdYS`sK_OcV)3FNA}R9MxiLztcKxzX=Fbd+TuhKqx**cjO_Z{ z-Gyqmhb68%|7nf88hO&P!?94Kq(CI&`AAZ3q}y|O?tGg`&W2FOjk94!ui=))ZNP?0 zSHpCk8O_Pg&TN^L7mI{FVZSfSTa!gdX^~8?*OL(m`hsC^i0wvCMmXflA<`sC!FEr1 zw|>3hUcs(r1;=a}aTmw#b*E=W7FVfoMpju_hR2%|Oo>Eq^m>a*f;VRQs2`#JQ}SHH z`mf#q*Jvs-+pCcW>w7`ekC9j?oR@c7A39kguO^cfggY)%lGZ=U3O{m6qmr z?x?CAJDVn@ljs%WP~cuk-Bm}uOMgB?MC^?iI4P(b$7u<`T|5_K^dq>B1y|3vM7!nK(ri{CL*NfS`h`E_;M%;#>C+lun z*@=ymrg4+$-j}uWW=7q~j$MFEZ*g(5*UNxu?(^mNe9c0kq#UoeS$=AAYCblvMt_g` zD@C0eEW0`+YDmG=r6uW}&StBP*Mia!=NEk*w_OaF(A@7rOWr zJLm4T!5tlL|E?d&6)~1Cp-Z>r8QE!tW8J%OwkL`vxuZ3kUE1-i9o_w7sblYwnlbh= zsqOA((kb0NP3ET96?0NaFe|`KuP=}l%*Y7%*cS8iM?cI+u2dFO5k$h`UXGX|8M-xb-XXn7fgb*e{MX4d=ze zk@RqOmM^VQK`;;s73Ae-y8}6+D3oRU{gGf+_?gTce@;fwlkQ1NP0sS<_+pvfP$1$7 zXJ%xid$K&CteBSJ&+vQF0vSAxB_|cKP#%y^8m_Zf%t}}8e6&kXOZ=qQ)W4>sEqC8= zG;xAIu#~}Cuq*cy_4@%0``$eDaC2F|tI0x-l|W*|U!9V{hDn((Jw4Nx7NBMG=#}0< zUgq_@@_d8%E}0E=lpb9I2cS1y3bVYyAGSlnfs&=wU3~bh$5FafQ3`IhQ9K41~jh zK!j&m^*_^j>=tJI6=BKiu6nVQ$+&s=^0=vgWP?-p$<4#{1EyizbkMxjEfV9#eW4|} zJjjQrOcEVYMbMEQqx=79Re$a&u=}FH_bjXl57`o~TS8x8O zZwCDtZr@DdKVe76?VAFMsT_PDuiq)lRr)g5gWtdCwyj5hk=rKgE@WmaXgtg1?1v&yW#Rauq1sq$4;X3<*$ z7k_3SZ3C(c#Ldv9$+CXBPE6zJCi4u_isTy$#kOBnRb2^p8;yCk91Lt~ zL#!b(nt03n3|?;X^YY76^0U0TxjaS6%*@R2MY1!p^L=d5`e)B(lm`Qi(^$TSyrIlU zm^sCLemP1uCs#-(B1n^tKgs`abOc*SjS^+QpvRT*3`=uWUY@4iRgt?to9J{AWHn6X zEcV?p*-4l8YVK&*qiN#JDu@;J$_YhsLb1|7up}IHTE+eT!h(jao0}UpZK6$z{E3Z+ z!otK}PEL+-c@qbv?mgeQg#NBq=>I>Dj^OfH|Ky#r%ylL7CT1;`No@O=%n8xPSBQ5n z`)=da?}R**otYi@KJ!eL42v674e zpEo0vRhW@m;ojL67v#s?JKHb|zWd3VKai2i3>NhNKb*Y@m>gGiFW%KvUDZofckR{t zKHal#J*^&TB#m~-wia8qWJ|{KzVDHd4cNwju|1eIfQ6-h9AZd#cEE%%AK~H=r^aPU_>8f()alg88OI`vFG?i@b(d(2SGci z(p$L0_`Li8Yv&hxE0qbEwl3Dev$ui$?P0)btr zjwtlET&p)Ol3@B;cVQ%#C5q=-CC$iXe7yfo;~lWa4)kPS}+m_2=SllS_se=z9yeTt87i)Gyda% zI^Kg;Gn{t2)ZoD)*e9=@(=s?a>)Lj|b+B5k)@<80V0u5jDUt_8WHL@L_xFdWeYU1h zGop8u@W!qRuowUr^rAi4V(|~4fv(`lgs58E!`}=XPMHiGPnkDe{Js)i<|Bs=Jz`Gh z$pS$z$gT!&N1rvRH=;rNnr(YC5RA$Eb1~W2ww-f@V==_X`D7@_ik9~8lk=H>b`9Oga-iua`N-O z+00hRh;|(_n{~4D?M?C4O3g5LZQ2Vcv>(8$g?>O=2+6|O#^-RA`f&(jZ6F?nU2Xg? z^iJaU5^VBHV{fC)v8^;SULn@lbEO(Pbj>BE?yYy0l@u%mqzUW*6p}ps`{{1i)8Za} zue|OMc;{v3MN{m~5Ttq<<3*5jOJ5!xbdj;Gag@Lh|Gn?2JL_61rU`@jpL0<)3&<~wNf8^}C)JF}HC zGu|C+PvRVj=8$oud&WT`+&}lHEQSJd+R1#+8ylnYTD_dBRB|OFRfLJ0 z+si8j;=J@a43oK-$&FO2BjCyYCbo;r@c13GEQ;p=Ju+_>>0GpkeX)v#%E0M0GUAQg zu+ecgnwMO{w3NW22Fnfia&ID^D4qzW}uGiw}9^a_(Y>-!O~N=tQL$tKRzP}xCu{dxQjd&cq4Wyf zJG6%pZ|aV&%jt!Z(7XB#f6R>#@pKt9Hq(9LyMy0_?lQ*D^&MI|=Xas)->2`yGoPh7 z2Fwn%BpldGy^wGfwozP#%a5)??1Ps8@&fs0GO#)!o~^YRu354)@kw3B<@rqlLLdqP z*SJR{AqM*mbAH8P$0G07l0jmXwqj{97w)f^o|K_YdfqYJHZ^#$k}AapCD9gnUJ}gD zj1WjB&VhP}mSDr^t%TjCE*Mr>Z;K`j$Vr4n<O4KL`*B+lS zrLW0{`e;jl(U(nGbiLoCPhp0r`BV0mZi8r1!<@Yib7m9Ou~{p!poX5#)CA?VriD$a zmB5c>9WJD^rK+1sZ59kM60sq{r<3_=vr=i?4?7I}WqgIuYGhDXeL^OzvDs4En+42R z2TIT8LZy^V7cLbnfL0ThnKXn=ske?)s?BOXnf4^viAeV&ERj|St-Fr{s>~t*G3828 z=*+XF-JD~jfhIcLCa{1Y1{Z}Ly0Jw{U9ZHIq?(OTbB9F)Tv`dV=#^wc3d?#ngCL8U zh@ljv%4jto&X{^6f~GUBWJF`&I^^xSE%er~EW80+htoRQ5XhP`&lSxckt-||8*G5B z0elO+eX5#NVY*hR(JbC+g)H<4y8>_5MNTXpkxW^#jf4&diJ_Wq+)jAFx8KqeXbC~P ztI!VDg54VI0UI^5VchR1a*~=#8@wqMy+|0W7e+dgz|dvF%XT|4*ly4x(5MlMMhs{h z9RH7^CnoV&&`MXW_WOio&|Y9MuxGhncpr0!-SV6>UsjfNDgtY2D+ zIT6`56`iee$L|Z@D~Jd8^~LLNkbIfF&b0k)Bel?L4(`mL58alNelzA<{dPeuw4Xl! zdo1MB)pN$do!?5QirGlN(|n;NCdW$$jX&hzFPO>l!hn`|bCeFr|Zc6BH1R+u&C8bT2WohgIhJav&vS#s~n8|W13UyLaQwL*u3bX_p4f#wz!+fUX zM`X;Mxk_Q=s3p+_P|k#ww4gExf^0)1Sb@tlo!$M}Wizg(b4LgQ=_sU+L54y!1{Xm{ znrGrKd(-9L*ku_MH<>h%p5gDZrwlWmNN112xew6(7Rw-`Zv=Ua)*atind6b9nf{Hu zAat9x(P`1VG&gvXD9d3jtf`{piBbgbg=9h!uM*^F z$`mfVJk0(Q%>m-2fT*+8K_Yda3DMA+OcH_$aB0EQO*NrNUSUCsi13dcI&?@=6RNoN zii9X3dJT{q(C-1jBK?C?OUDW5Bnk;blvLR=UO1(xVZjI^)8fl^2Jo#!*-DNw0Q)@=$pgkbiPJh#j@AO z2q&C=n~Z$<|3t)K!yf#ox@Um<_hikOofP7Jm|muz){bf9NjWDKtebMWKNA*6r@g{T80;E!$w0e}%(6 z*<1WQprmGU$q_+0SpEUfKv=YIW9xE-LA{fUi3~32_fdcKU?I{1YI)7}qlGPkgWr{v zofY>@C zyeDkztTxQDTWK^8xp>`-e33u~`z*%hF?#3$^+3&j>^8baBlJc8J5w$L@1`!>x@pta z%g#e=A<`l&Bvvu-THI<_PJWDymi#xt8sRYbm*M#ikVhwFuDQ*ShMlUXo66Z#-lqXCVDcs5&# z6xbEy)xliswUYvEbk1hsx?;6jbc(fV$=Pf{H@nexTu0I#Fv#Z(uH_ahk|eyMdA6upiM-Ekx%CACs6 zrLSAJ;#etL+HiFoFkTmQnAwlA#o_TW=4_-!hm*?*HgKYmRwmcIVsa!SvQ_g zrwDfm;Er@@lr&>&m&eU4)Vk`jDk7K(>+ru3Kxn0UU_+KEt&GL&GVO?tM{zuy?D(54eQLVxxRI zYX{1=6%g1df6&kQe=+B0{t9@eQKnf;X3(Yf!V;y{27PtFF*iZjaO^3=aIN|%1VK)6 zW0VABgl(@>3Of2?A{kDCM7eePVCdJGeV=4ll3qZDEhhz11aW~JJzr8lHf$WRe9D$*ar810W>(Ov-@ zvIBQFR_Y0elYTKHq{Lxf5F&_;F73iLy9_OB$uc15CNi+BEaGKs(Y;KHVmYFK`3}IO zJ(RRi7GvEL;5TCz2VhbYE~qE;C8(d}e7-CvVwDYu@|v;=s%|DqW}#9ksA)ZF8i|56 z1-K+%J%+UlF2?8|q6;^>x8a2k<~D|?l)5~;}uZbUE0%1qIXWHl~@AQY14>>O(CXI zJP<)6&JSgsqLjhEnytl(JK;@wySH7uu6+sah=Z2ijC-Kv4De*qb1+d#>qf>H!H##a z$j5*W+dKpkR1`n+Ee3%{o-vxnGM*4%l>-P4g^3m<0kpL=qQ+qYl_gWD62$E?Y^$*t zmQf0UXj)83F~|_mWEpN5;2b@qQIH0^ws4GowsR$tjbS74W#g-sh9qN42fhCouqcwW zO0faYBkB)(4s_PQ9gGwekSusJ?=?h=dGeNmlm0?97DeQJEUi0PxPj9ehyxP%)va84 zhpQqt0#R7eSPFMV4Lyn2DFpA@sm&Gy^wQ1*BDEBZg!Z57!CSDKK-v%DyvTaV_mz~e z!E>}Yg3GLEH0{7nqMDcMF-ucZiezdT*GQwv3)UFm+{EFm_ELtXF$}T^mjtKQGF2@H z2uch(ZYr)h-X+Oc+Hf_m0#A4tZT8upI$T!c_+<7cHh)XN2~FdUYzgtCaCw$$ z5Zw^0m9L6Q#Smd}f}suOVZ&}zDou+-PZ*%w1moLeLwOSQ7FaBS1M!nvy1c#}0g5&n z;wE_{76t~DSTxW{&N8foleQz0)6NYnEdB@~(L+Ce0V5R8d=K=xA6j=3Jeu?^&XQ^O zr5&le3w3B~;@*Kq12qcRmSoaaR3bGz8j+*0hOu2~lI=!+2Ihz#X6F#l#?4q0R9k=; zAVpYXMS(ysG3vS2I-bq2&6z?vLt^2x$Eu(knu+W24CsgJt=Av$7FSMSP68`Ax6%*U z*C259Te;BxuB+tMu4#=$>2rg5U?sm-j|3*QSC%5amFq?r+?dy-kB*r?lWnDItu6zZ!)q>+@g|J);A)BMB?GL7B4~aT z`UaDxYD8CO+xBUyl~zBBIyL7TclNwS@FpDHy5kAos{gj_zFj{N>ufM@5CY`fbQ7%< znw5V;V#?|v#u-pR75eW zQ8aK8d&hsHUv*fsTcM4F<=*n@_APMU1)EBLpMaF^=0e$9T~Eu=t!DpTvk-LdZQEbP zcN`yIW|;8RxBK)km-hFdFeI)sh=6+rS|P0NC;QSbNF-E<%W-L&9G{SJMdHtN zc%y}s>zK9;nN&7*hgc>-LU%6HkjA62rJ`zBnj$#vev-_@xGBLZikRC(5*x@(ab>@% zF@Zb|PDK6q3}m1e;AMawFd&5!+8~m0_jMm*B2g7?ZFJ~%%SbTuNL-`z@0d0kT$qSx z;n8>?tGklRb4Q?tGWq%~;TtH6gj)X*A|0MV+v_n?11(|+FpbXVj0`25=gtfXKkXP!Fb9C|1_f(;a#DY7QIc`ULK_~mlUU1!2$!2EMD ztW?6x?;;`%`^6d-QPSPO&^TTgr-s-aIE4{w^(43EFoQ1T*;y{jvr9zh$S9U{)53s- zlqcUIYsC-|8O_WxWF{pI_eY57qNtQWOCur59a7GE^zuZxm_ziq=QcDWP|Ju!xL#(t ziuA&>u)y~eGEhgLk#YTW1+7IXekHIUwh%MFa@;$zbw_p^vgU5M@g~e1$*r%!-0|p9 zN}gePG#;eF{ts6p)zLtFyPdL(RJ#Aev7I}Q?8a-={|lHY%2o_8kyMeq;FYoL%EJ%cY@40U||=O6Jb+y z?3sQ;`&LAnm3ikZ^4EF}^tbM{S51nZj{K_|h}q(=l# ztmPMQN@SHm4l0ADsS2DZiT{s5;UI6+Qlb{d1ccB07i5GodZe;GajyVVlH}$>Yo6Rm z5g8fQaYKtxl_ihN;y2%{rJhFgI>~|(M$`#CMUnNZ19qvoWEk>iSb=xnNQNOxY=NSb zO3uH^h{+N?8AcYxgLsnciZj9-sVpEbWL`1-D9FIN1mX4J6vd=M4-z6tGbxHfIGixj z+geBqSof+q6+B>mA))DsxmS@CC?f7_9Pu7<81p*t84&Hk2|POK;675X)8#c#5Z;H>Q3-Az#x9xY%%h^Q>@j($#~Kg zei!L}3e0c<=KTGBeygt^GhXL*^I3y5R@z0T0riH^m$@&eKi<7V;C(yoG*X>(UDZ-r z5Oez5s7ZuOkQCB}*bA*nsA7p&FOnTk`hqbEZ;=~d5(!VLt-~xbnhdL&o-#BrsW4(s zPGeRnYn`|T=8AGiI{x2$B9Tej+7zs`nxpZQ5=nO`u|$Apa1yyvS2JrLbQR{$21=CX zc6hC!>cg9#iNqpT!#_`c`!H322tjK+#Aq7Y<60g|o)TqbGA33B(zFs0IYr4;Pi@|O zAP(21szM=6R45gOb{QFKWH;6r*#p;<1#49mP61s95LF>9P&4j>H&VrhmJ}rMwd zqL$A51MrXr9uOz~+k>C)`fbeTnLoz&Q?NC_#wr~<{33t&d!MAwe}>N^pek7yWo>^Q5sWotp~;~e*ynHJ z`#k7F7RK4jeG8unKF3&OS`D_7cB_bNui*&zkFJ1{Xs28N;{UxfMu)a0WH_}FEpM<4|jT_~%gal%4a!&@E?xZQ>5>`5ANXu_v2g!@`;Gh29QJ8tw3*55Zgr6MIt7z#QC7J?8)2|@PJuFo1aJh{%rQqS5XT4FqrMf?GJ!lDh@{C*~Jb8{ao z-gQ{(*)F}wLEcRwj;E-_e+6A8&-`;p5ysB^C7Y|SpZSwejrtI}!JoZv0#kWlN)g6! zWdgnW9-;?z;5mj~(RKwhg;LXDy>kUkR@)%ea5PQ6Ys@pVePfjz|0aF@Hh3R)e^Bnk zKN9AC09uLh9Rc%PL*5g11YG|zFgg=pluJi5#zx~Sz{)2pQ5C8I-X?33g1kSf{S`A=CBidbMf>AupLnqXZo!r%+YZO0 zMkF29QhFTwA?#FE9C3mY!tOv;!oYKW9tR-;cBFBn-r^Z}fYONgX+=}IA{u%Gb!KS% ze|F|ep^-EH3S5o?mu*0zD-B$s9{i-Wiv%iBR@mCbQ-6%7rp|nyINiygi_^^zi}N`h z{!pKWs18?NLe_K})l=lqwwLIRm(F}1pZ^mQ`nH$;g2fBux5j4YSM~>iaG@e%t4fY{=X$Dz=&ioxX zO)m5Yw5}ne@JvO7&*u`@!gXYb;QuER2IA2S_CKB=PVuob|CezBCYvy`VdrCoUAu~g zI#w)++t1LqkKxWjaZELeyLP?LKukNu4$}*D(I9&v zt_+`n3aUAT&m(x(s}V*V(;+5w-yUz(d3u%P3tU6A6V<>1H^jFnl&BzS5YZfOdu-85 z$dU5lvI2qn*AQ)Y&rn+Y?@|2=-%sEh%7*Jzw<2#upY5%~ zvCgEZCV0TvHLfn(wr#k~)vO(~it1r#1@e^NDzXjmd76zG{{?lIm}dZELh|6d(j!<( zk&(LqWM5iJ^BTE`0t-B7*EnI2s+hIA|E^zQ9q+b@@jk6A!7qqq%YsB!Sv%!A>=y_; z^1SrxO7+FXdU4anw0G;Ro<}+`!~MshH4`krX>o%IY_~v4t?kR+j(y4bla29_k@1nq z^CwV_EN7Zdq1~LEY_?7jUz7xF)uf{`BMqt? zNfA?#5y~V-?Fg%hQp{wL@5QSf-K#}V3{Fu5U9?$gl=Fn3=n>D@qTEW8%>k=82q7F@ z_m_d6|4B}it}5YNGgZuIQXaDD3P(&EX^JkQJditW7&i&>R5q_{dof?ixg(dLq9A>5 z=qa1Y06{Ge(iLQIGcr#5`sCh3T3vuIOccauIvp;T(#=Qrq+z}|&&SIn=p|JK9}u0kvym9)8v_z`q3ib4&Cu}9!}`1GhZzfV5d4|JfE z1xBBe;QApZeo4)6M~);Y6fvqpG?SvJ77#U2=Rg$W`A6(zOfbVn{xuM=MY~_^Z*U5~_g z8}eB?6O*tMP*-~8{H$rWr>2+lbbm0{5Dvj1h@Q@xYa*%+7!h$(PH@-RmZwfZ5^)fU z;#qpOu4~Z?6)$I6cN(q%UA{{M2>vio5=P1A6JgtgaIX#Et@ph$>Uqt3dE?F52og6;QP(d!aUvGC4)aRs4k(OjNF^E7l69;{ zCrwO^&+C*47a{oNQr1o;QBnb=fej&6t-rB4GExQS*2onHVTkj(cQHDFJOIr2{w{** z1CDoVzo?6DOqT`JaUs7qy~5vc8X6&fGKKHLsyNCpEeZoCf0+3wsv z1IKy{i_sY|R;;~Rl9Av37_CL3*T?WAWo7vx2!7da##0=Z3dTjfC`BTyAnu@8ER>7o zW}{pt`GowWzY46-E{2sy6G>Hy!Jld2K^sz>?k=!zIcGSdj%gR_#qkt`{Y^{aj**I* zFU>^urqgwJDutzek$FU)Gfnfyfc@ssTUc}gB~&sa2^-W5MG;UyD+`P9cGcZ^SB@#L z1@y~oLGFPhAiaR4qOW~b6cFsz_$?5vXq33}&n7mj$bRq%1hca4V z0D-|^(<*u>z04x^63LXO=WG_xXXjR`^&Bc^HyVbK&Y^@}y;^hKTD1-uCOPrG(BHvp zjNOo|87!j=Z+p@tW`OSM))#o5mJs%DMoiuM0-0+ru&R}E*`*-ItPWv_s+plG3S?Qo zovu9EZ5Q%_a3f$-T+Nq4zXEwdC0i=l1b`;mo2gVsO;&!zJ?<2-EDEd>_n_LvWRu0#htATx)@Z*~YCE@Qw|ZMM+hFMTwq=hUVXtFX;DzU6 zpwgecD*1sK_`_LMa_mTMIt}Z;lSo&xg{zbiR+Zeqo@}uQ4ZkWmmjfYHGCLmD0Uc<7 zZc#beTE-0vM{-VBIGS6%E;fF0^;)NNk}yNKe>(IXNP{H*(0XaYas)OF>1P1KNHM=m4!3t`3o zBJVHBt)y!6$oWp|7rmL3+3g|b9!1xlSeMK>S}cxiA!S>3K@ys) zZ>YMW7fBe8-5r;%C5XP1j2^s(wE%>J+w^4F3~2K?wBXDAZ9*5c&iA?Q>mkHDJ7-s) zewwg_bsl;r?gQlkTQpO_T19ZcJH3LN&Und`o%b$Cq}}s&A!g+Wo}&5vdk!5>F~|h{ z@Bhf#fqwuE;J6EY_#y5hsg7u-|4!HC_wt@lU%2;*>Myg3AkXvLhgR&=_*Sc0EmyE& zA;%d{JNtSo7Fec!eF_k$jxcn5TJ^(go)%Ze>tFWAz11F+LpY?M$2(X(;%0;=gnC95x_TFVoyUR7hFMbZj+ z-4*N?B)L-H40e7dWGo4L#`3eMl0EI=$PNe`d-onxo0-h&-b-}^+!6KhOkv+EZ# z>4OD5mDDO_D$94C5Xss0ieY3%N66T}IDx%~c6*XGuLf*podvD7u3qpiIB{ZyMi&7c zQ~doPpC{U4eEw1Qu$!oCx5iQJ1Z;l$+|Co%ZyE)bNY+9&B(MY#6KxQe{{-L=m&en6 zEFSvKL3<(7-jH3i7c;1Dyn7p7yLaKWdmEl3E`N)!d-wuX5KYFb!3P`!B0dl@jWW5A zvZ5Bk(Ge(-%O@R_v7wB^I10TY*xErcBO#VG+$iGwppHbM!7(h&4=mhSA&2fOMcUmXBawKC#B~i@9&OfndHmnP; zC2Uh4pYA?Eb`-X0z!(0s9g!;fxSgAr$layK58rjy%JJjF7yvs1258Yu?Qq>4-pcy* zE1Nd05cLns(A3f!(Gs_mu*asn+uY@ql@qv|*FGUCK!S$*1TGNPv!*Nwjl0>z50ve**o&4#NE%#NnOR6YeeEvTM)IuAqa| zf5^wMqj9R{@-@R8-%7^S1X9JI4O#9=3(oNkE1PuJTnOgp^Bn#vM>e3hTd(VQ&m)o5 zIsxo4_|%VY;6Cgk{r#Z6e8c+<+}iQ{-q8KrGWdSn&-oi?|5y`1Yr&6qtesb*iW2Lm zc2rW}2^ZPWnon34OrWSB2Fv-(vw-05BK*_^riOJPcmOw5ARfEm8q7E{Rp- zK&GrhxmK_vc68DjRjg>eUWG}7>^MIT{U1R28TOC^lrJN(v=0-brZcrL1V$T72O-&=G!b^lmq+xiAmWL=F(-|gk?~x{ zm`vODh_?~{O66KLU&;PE7m&(`e3)Arj> zKXf}`t%C2q7CMFRy7Ciah_%XP_Kq74+M7?k{x<9Nw*ksLv@r7QaVUT@Z$JLaPu`40 zA;8m6KpnW##1}~Sq()wR^IM)eZCz$PNUe}T$Ld)8(@vw-(NB$A$7@BhWvs<0z`4ZeJEdPIAm zfCL0l5ELS~AF+2P#%99yNIkK5(|q1k*Hx3r%7ThR2rvQ<&wU5a@z^Jdwq_4f1y#SS`RHQ7lwpXoL)d|7h-Nz}8=2PH23v zZgl%sYkzIObU@u~T3ZtrMh={|c6erHekO0Gw}YC(kkm7%V0s!WnN|gegyF;=8=KkQ z6+&9A{mrqgo2VyZwFKoqT^Zh#>_>KKmyHqKcmXQSMdanD7Wz{f1Rh1f+=iv>V9Yrtd7p>&K zXIuauF;1-EW{a=lN9?^ZZI#59zrV#ootY97=!^hml+Gi{O>pS*b zew|$@iOtzl)}_`10)I-voa94)&enYj^iH}pM!;8f%ki+fNyG`(_-Ac<20t?;d)l_A zr;j%uj6@!6E>BI}aKED5e+^+~8~n(>7y2}Mk-+MKu1fP9JWtp;2etp6eb}}SA1+%Y z!RJxaiH?mh9p}@BB9TLz#t$Qt6vs>Ca*mbL4Gl4m_@$jS%V?kYs=+Kwtnx6{B*!)?Z$(O@?c~0BphZUp3jB;f#HqUPYW;8mBI2aBPCBbKxO+q9f$7oo6(;n<$Etb%P93a{I4&*b&=`ciql zr^gzql1yp)ddS8$0ZgaS(s#No!fpl4(C1I*YSACsnr(inI=1O2v`Hf-Y&jU`cY!TF zPR=#D45tm_(h%DIwmGjsFKWQQ(5wbiU?n?l%5GNEDQ}%-^&wIO4d+1jv=4D=^t()3 z*f0YB8lHfI%Nu;4H(4Xr16C<9Fe}>`HIi15!fr%%@uBYh1d9ByZ6CtVp^}x(mGgyi zu1YpNkmX0*%OjD?-KlJLd~K?fLrt{%=kU4&JJ~d{N6%_|csxI$FIae^_!)&5!u~Fu z-KV3G$WeDPlbLjbcN4n4)|#P6x*RwK?Q3K$>fg#ZOSW9KoR2wp#MZ~dKXBP|g6t1v~ z=<7DDp5KM;`_p8W6IQxV%@->9s*Qt1v8%n^w!a?;5BBiqav}e%Caz^O;p%0*K+NF5=>k-4l_A1&yNGD)_&)tWgfcq=k&#tT7_Sd)X zf#8xwEjTwz(RBE|(lT)TC*lWkbV1cqA3%08O7P)TiN{4($I&&W;ZlisO^YWqW37wm zwT<2GJD3d->lZ>flcdhw)9-xkTFcFpve{C$gnSZ&K-y2+_PSI`%sXzO;5vC!hNr?h z2>GNFS^ovFKgX;vOzLom^-^g|8ZrC*usu0BHDx~`joNj)@wwgBsI_gYYKd1Kla3w{ zK`kaCx&8>X`Z)*ppTg5!*&WbO;I3V3+Zh|iGkU#Fs@-MVPh1?n=s@_jolRdouwxM! zEjC;}LMV$qeF1$6tiFAH`EA=i6>i!i_UPwc=6w(^XMJ$+%pc+zZcn1g#FWx6MJVBP zJvPaoux%7zt=>B(zNhZw?9aWt-O5;M*os==yYC8PmxZJXIDY~-M5iPj0TSe}HKF|; zW6lMR6O*#moK45k_ZXJQ>34Md(Az84|g>I?k3ygYUL>?tk+KF^!!%G-HO-@z9&?{ z*Zz*l1yD&qk#J0Q)g<7Wi=oP&H)hp(EKye{Bcqqug}hjsI%UN-cqwPR0Uo)ClSXbz z87agWM4+o%&`yZTgEh)1Jpk1K+Prg9{TDXgX`>!sW9APZXd^NN%P#BWQCgp(O`pbD z%r`-57Oq7(Jq=YVP=d?V;Q+@85GukoC}XJ#e7ubDM3}C^W}Fb=pjZ|1??FkAUTAN; z?#Qm@q}b~0-bLE`_NJhiN_ZbO4v{@ia<#^^EJioIXQ}UjOk6v-Tp5w3XO}mB!eLVN zsV*Gr_0j0-u`3WXzT0WoA8211=m}wg!{dTw?ZC!zU7VcRxb#7PyF0aIoOSKOtlit} zP)ih0`J7Y!MgKlLIMm+UpSpNUzATPTY*`+lfMw)tn~HD|)0%7O;a{+kE-xM`e&V<%|7w)W?*dewoA z#fmsKwQ=cxU++mM$EcX{Da+bACdfuqIFLhq*bDI@>Z)R1zQw4E^oANcPXw?)UEEf} z=Gem(!fsci8&J?c*STZghGJP7pIpEA*?Z^BD#DMEIZew8zaX;c*0G3zvZ6WJFv>VB zs6^Xe%GFiGrfA5^q1Bp$2E*rISQf$@FxBl7YEzq&?J>3TLDc0JN9V7Z%wzF+aNz3R z^<0k=F_T5eWWNfCEKVAg2_RVnAU?AGo~7c_b9T8LZp{Abn=e2ACia+!XGr&X3etR$ z*#OScAO?`lrNa-Z&{%NXxlS6(J2#DGa?(h1Y;5bIUC-<8I@E1&^;j(~BUts-UBV#K z7W!7eKdx)BXaG(PgERWK+jk$m>*CFfHa0IaWtHX+U<~xVD{eYpwe_DjJkOc*E8MBFJF>&XR|Go0oR?uqM}~1l9NG)* zROR<-npDnEL69sC(Z-JC!E;a=FJSf9&em+o!z@s%|KRtTTXJ}x&)xcS>yK|JF1>ZQ zSsKiBYc)s`jDMC9u+GL6-@JiG$PS)y#P2(Sn6}`)+vq+#kLp8$z^{M2U2z1#zfRBp zN8kP5X4kQs!=rNz^iPs-!Gn#Oh~ER2HO-C$LkVU;q?#lwOAfYjwu)M^58xqVE@E6pbU8@pe6=po6K+HJTL`2BYQ6U1*i zPVhwV7%uD@A6Ih9__!NUv~XJ$lKssWONnCQzx_c9qQ5WwJzc5o!O zg}iM0;*{gyq%*K_l7N4RJ4?Rw>HDlnX!H8scTXwWi84#lz9f(aXdsNip_w)%Erb2p_<8{H(`CQ-GRF%@JK9% zAU?W4e-GQ#c)Nu5s-;9Nkw8OQ@C_iG;(* zY!Q*TTT98gA_B(yFNzCqdIoh}!?+jqUFlwV;;bvcXejhWL@E3w%?UXxaf0y|v8_mm zpZFoH2cHDxErqVdN&{C#_d1(JifM+skQY$qomG+|YOD)fMVzgrL_xR8Iz=9M-{Rv1HBx{kl#)7O7L&Q#~JJ@%k+0{6=?7ZC>%HSgJ zSTb}SJExB9zx^@%#A^z|R-6|Y*EKq{K)Y@s9!n-CE{?-owGLkP=$S9TgSm*9j(b9H zz-Jks_lGv%^BwFn<#q34pYKG)28w9?Jo>oE`{?I=LXTLhkEOvrg4ZG@`4iatn9Rg< z1qZS{!U4Di1O^5_GGOPHsqyitEeRCV&ggm+MZ!(pxXd&1M%mb%FJy~~E>qys`8-R;0U&! zN0YOY({l+c-WZuQ_t*%e5@4ebg&qPgCki3Oh-ie_;RuzBBO`D{9>e)8^G2m&yxG~p zq)oUJ5qtMZ%9-m`>7GS{Ll%(aRiFXdKKg-k{r>QK4h4W7>M`zz_xz-@c0d ztORYp$>u&75(=oI&0sjdcN=kIEy#*qtA?T|9)9je^jk8QD?8+$MTDVySvVHonu+OK zGErlj5Rcz$*v3}8@Mp`GEr@L#M;&TpACLu+YTv9P{-nY@Q1hs}NYhLRq+>o9Qr)JX z9)<;|@Myyc;X_h997WMP6j#@BIc26=mfcdhv`5UqFR$n*@EEa-#dzGy8tY>5yYt1} ztGTTvlAzG4hPC+-v`R5cEzBbZ$ijsX13u#iElmg>MFAn!pxJ2lEhzwJVU~5TS}2q% z**p?AsVw68Iw};XmJ~%;WlBlLv z!tx!077_*i{}cTQus;J?Yd!h}>kWFwEjY~Q4s;NKL5ZMW7%>{Sj7uHN1}36YD-!_tc#RXq?VOxS7su$`C25sRYro%jZt0MiRszM zUU;(;uS+W?yux^$KQby!mZ_dRmJRsBlh8DX^UTvR$)L<>fo1QJHK;YeSzsZ}2(!M- zO(#4#nH=}#ya^lw>LoJHlUgBDDOq;x;U}NGd{@jdFFBMg&}oPXWE8&(u(Lk>4OOfn z0_5aS8#q9WBExR1>sHHf_dJsrsvpRK%D9k0BDT zRud+xo#d}7vRwfz@(XHYTK7lNY3<)QKcATsQl8^@^7_p6#wC{|&b!1oc<>ematdH4o+a%VwWW}){}S+O zVs&$$S#Zu|2izONAR^#Be^r5kXt12Zn+mIE%vp`HM_leS(xw!SmT*?1Wr#*a&Q5q{ zD;crrXmtnYeIpqP2OHzq2~J!(w*}CT8AiIn5TL zdObt{I0_wXw+Y3kD2Q3dpIpjFSjp%B)Fgxmd%go5+>T*mlO8Gc)!~)W|pG9Ot^A zOX9#s>my8`qjS360=g#~A;7L9*c`h-z$5V)%J9bj;CcR%z({O87fWwEf-(t~9d&TZ zi)58>uG97_BBqt`%u>Fz6|Ol0g%wh$l9{zt6y8!G3t*YVomk$B`51c?7;|B-1omlz z32K2mY^ecx3gOFrW6Ck<2s6{eX}Ivits8M7ik6JbG)L!9Z;6nnNN?9R<{>Ij-JBm` zH9tf1@H{P%4mbw=(#{NC-rZVY5JMriK2V8_ zdNLmXmNtfVp|<#?=qom3R(!1>Am5Pc(E0U?S!Fi#7s+8fe@m{?sHzS6pA&RZK*cz! zB2W+-^Pc~%X|s0=5gcHksF8#kGtz0dn9if7os%e|s$XVOm!gqWBqpWGsYEO~9+jY2 z6=D&jnH6!+Qil#vO?r}sqp}gq@3`r>B}KAHl)H1Cx|&TRc~VH{;_$P|lY*0s#83$m zr#GVxULvBCcMA?B$`EJ%UKZ_5yoKT~_IvGz7WO{$I_A0~{KAFC?j(;0qGNfcB+@8x zKk9pc!ND;w-%0L{lxp{sB2w6P;Gt{h=9mmK_uV&uurkU4nrc$8W=tfC`t6s~*82%SE`? zUB@t-^)Q*xEB0GSDTyf5*()U(-H)5#=y0$K|F4euj{k28^OAxy}i zv|D}o8`&1@cqA?wC^#Y=AK+9RkWY|HtSVU*EK>Pz8f=erGWfFsAZ1IC? zxQg;9NmT6sOP+|wtVULr6=i(VbqkW13P(1>Is`U2l1yHdssld|fF)LK<=dEl^5HVs zkE&*}I__XLl%M3C!#ai8cHWsiAc#(OKTct^*wNkCg*s$6-;>8r40#q`U>EFp`M#9ONL{u!Q<%|+-;8>7Ea;hc^ z*<@{I9BL@`S42d(D3=H&jH1e}fUlQw%Ph8A^^`r786-BxH-vWUX`J^oy4bl=FYYZq zG`gri<0SLi(W85l$z|;*VS5UY{+O+FviJtik~@P=9io&Z<*=UFmf3^YGraW76?k^< zjvYsL?mXH~?Z9e4-U!YH`xL74+|RNr=JEN9p})oouH!8#TdmW9P2}4NS=_Y)tq>P) z%`Xc?p@nc@zbgrRhN%!0+g(tBiO(*g0Z}donx=mNgph#>f!Y?4BvF+C`9YM=S8>P@ zYUsdHmyBvAP?oGY7LKD4BqcdnHq3+)o{GSXcjXL%Nd%l#6i*eZN8ac{=-!DlP;H#a zVic>3%OfL=4dqm6%WN_k#cH4!j~~PD^Ay{ezy_(x2@0t#Q!y@D)zA+}Dv_0^gd@Gapj2x&ns zKAD5DI{*u)8He;E^dN%1d;;9X1%KJZs3EBB8#G3{KN+Xlcn33{xDwXu*WR7J$sW~~AV?ouU47sjU5&6@q>uSntHKx9L2uD5@{AHUNC{29 zhm7NPc_YUhty4~dv})ghv+R!&{vwI^lP(=U4Sc0iMj0DvRM8lstbY8dMiL60nMk14 z917`+FmU3P@S+;|3{)5cA`FwC1SYFk1sg!~2hhKtK9zl#{ptN)WOHpG97O{zvEfIt zwds~&9t4`RXAJ}g;9o+7R4_!sdVP_Oan?QrGjdu)=gc67ONH8Tg!;S$Puqe0n ztYD=qQ~O!QKvd3YCk`oklxh1k29kGi3^t#ppN{{>vF>ghUD!Q(p96vkh$cxT9I1z> z&Ok(SOxLbX{q$Z5umOe`AHX(`>^lE+F30=L>qkegZ#1;XyCWL?2aXNTH)J8={a_&d z_u@!x=TD!h)$p^S-F+hR?swDLCL7fc{HL(kho1xEcYg5QN(Dblb6%_eX?mV#QvEA? z9_G0IrxErKOR)#}rgPag$Jyq(Z$yoxP3aNX-lJVO&#tcCV`R(>_KQXI_H3z%e81o&qd;BCi(5=@&jUC7#wtdZ64LDDc_k%s(lfKAy;IA?>p z1$tB*3QPfH1zNJxnf0==H1f7|`T@_Hy0^S~OV&Hx1^2AU@kP28Wlrmmg%F`du+E0$ zwA#}XUb*~qGWiZo9lO?>@m5a{!g@EraqRsI!yeSzKJ39ZL-tb!T=CKOWOi~ojRe&3 zv2<@1wF3vPx^&mBOMyQ`Mu(6o52#Cci_G6H{s6llf3z?03|FQ0zg%}aey(b#$Hy}5 z_37!!Y=0A;iio0Rs71eJa+$A1ueWo27+{p9B-DvLXU zR;a1|)~-jZfdu?Lzr`A}y!Ew%I@U}wA&Io#lT2n9)^Okdp7Rds0d-?*@aB!doBzM! zO^>sm>TrjGj{Qzbq&@||BBqE{+chl2h_Hg%JiZ}~}{^h6jN#T83 zpmqIKnj88}TVsU-`FqxT9BTR}bP2i%^87;o)t#Bv;OGZtgW5v6KDE^vm>JLc^`Pwy z0b-t?a`JH@9L+mZQ*NqJ)0yl%Y1On^n# zg_pgFqDuG=Pn~-CWq_5W2}NOGhx!5mf$aXRc?KXQFo>P!hWfG;^aWto=*vkkCQ@_| z2SWhZuv+up2DOF}^!gHYUU_9;i0BK&$NV+$GKLYYffdN+Yjp3EzhJ`2&M^gdyE*uA zX$Wss|MMDsN2@2-z~YRs=5U5ETN@tTM+XpX(8u0%Vyqj^{5N*F$5=Emxg3Ei8XOQu zV5b}I0}LChh+AP@ z$K#DQgLMcGj3ne-J*tES&|kT)3v(=vJy;23?SWQmH3;arEoRc{ECKSy0mw`Jko)K*fLx_@*MN!-WS`yP6xECa zLceP0>V#(Dw4}cI*ArG^Qnk0~P}+%b`WALsrL2qoHqP$yGA%5$%ul9k&3{Di2X1JV zI-%-D(pD$q_W5NFKNvtQ0l!?bzYWOSsQ2h|9;~r`hP38PL?$mtbBYbLx`-j$v%l;L(EM>32fqK?bBNGVx z-Cs!`A7re@)5(0^7$2I;>iFy&jj8POZh}hk{uh&!cY#&Vk+Q~KngCe&E1)y)kbN-U1QQ!J@mvEQD#$f-% zSkHz8YFlG*DQI`s5d7*8F0Q)c)Dr{E8T7HYx?Us;JJnc7guaQ0A2_MtH(~x&I2hL= zHg50xxQbBO)V+fwcQ56=y;`*qMmtP)Fn>a^7GSeXAiIRO!-^#=31`m&D34iTQG;rk zKn^!UO{=fg;&F9owN|NVj3>kSRNRj!-gK_?KxBas?6Glk=2yD%8>f`7e9u2jG zxDlcbpZts?s+(d#%15rJ5o>YxmO&O(9Uphd)rrKwL{g3Mlk4JW|39!2mocA2IWxi< zg9hthQUpxhYpexY|9Gc}m6@*rqDHM2q<;718t!qHq2S|VELt-55?3L76 zJ*M6=fS3n9_2Ll680^#YjBlTfedYWs)SJ<#Ky;U+vjGkE>Et@DiCfj+4iodU=` z%?FT7oSgA}==y{w#$ngM|HnV@(f+|i5c+}f4iF?DrOy04TZ;_i#H!aAUFRwF*?~UQ zj@`mQH*h8lIu>C%Tpc^y--AjiiULamo=2vA@rV>&d7lf_OA5}G!b8c#M5ex=O_sco zSY3_RaCJi>QTMW~dTBCa$AM3(0+$8culsPpE0zVS2uNkGiEFVXisIh17T*;|{^f{Q zn$#BRnTbRaNQ1C0j|u=3chZxkdMoSI6NwE`1r^e$3OuT)JjX3G;Onp_bKM08d;+#d zy6f!we}OA65mFq`yQfuk?xxtyBZ+tm2TzC)9br@O5JB=!@WzlYW{%~xuYpC<_-H3w zo0)i^hktt40FupjeMME*xb(VV)-ii~VSqv;r8;*9?I%=K?-f)mAuC+hiPB*D857h{ z$B>C-y;P*m`OajiG?j7USdT(Ph(;quq_bV%lXwCvy-zxEx^|3+vMDfN zP_$Y9I0j4?wefDRde#c+71yiyI0EUK3;tj1j(pF+$ot39C!a$v=~^@*$_s%hgU$u( zA4g!kw+GcCRf9_}(}ZEb!+#J&bQ9ySzRFl4NG)3CAT zajrXXE`%LHLHl`}ruR)|Nn+CC0P+J{l842<2E#l;5);iQxLN~4QzmeMI4?vPKFi$Z z)RRA+Vm7GW=d;GY_CU!r&_{QHp={VVH9Y);EM>jG3_XZv6N(dB9_d@7$=TX z^KmxOoLWQB4v7u4UVGLd+NGG$4AeroT&)tQU(qkbzF}B_zp4sib-d1ca=Co3nYQ z-yhfmLFpX?^DC`KVJYj!NqiHbsT13>LtRqv=f0xO`@ma_L|BVjaa{r~#9&w97L_&G z1mhks>OVM$`3E0X)*%z358)Uc4ma#sh{&3<=E7(Ept*puoQSUv#9UxPRZqSAWwg@M z#}i+EnRcasX1LX7fEIm2Kk(9SeO!6?fk9L}@bEUAquD=vYG$yHCp&BI4s6kGQP~iC zom6x+ue|b=K~#K&?Sr5(@{5eI$hfsAY|Yt(0|%saZT|!&4h#HawZtvz$)3;|1YYma=64x zXy>Hgv#c|n4+Ws&{SBm50K(dmBGP(AiYSYiLm6;$SO?$3IzV{g&tz+1SV8ZZmePKU zOLmlGVNfxu$LX?=%?bFE%GKhqwuJZ3iDFjO%)k;j*~Y=y%cZLP>VFdrEG z0#T`oFXqsnV0BV8N%Uk5xd;ms_+Y;BcOtpGoXjPuv7V*YxCY9O1PwTWniJ#?ro0F8 zE1`|Ew{n;iF~|7r;CCBRe){*(`#tX}*PZpet{T>zP)bq5cp|{ti@wL0w?p__b9ZS{ z(hek)?r&EE3p~j+#>BAOAn&dpeRQ*Ey=#o8yS$a#`>UTLlPzt*6*%8 zGS}^?a=zoa+BY)tg?}1y3a{WsBg2+N_U!)Ov!@My>EP9G_<@f046w<5<~(nTjj}gy zkTb~cO!h?@**U${n5XZ))99Zj zgO~@@uc0z`lEo&0Y?(SrNGRasTAWDQZhh@;Nepk_9u}qR@1B{t`-bI`9NxZ7R7z@Y zdM1bGm!O;c0n^G6-*l2p%*54+IFTNUxrFrj{w*b0+_p`W@zBgne$(@ju(*A@7><1C z`I(vL0i%iEZ+82^0}O~aP{t!@x`Sx!_raeC5TbOq%KA}K#BJNda%s7ho0&eVAE=j3 zn;#Jpotg(~MIK=L{XsXjwDL1Exl{o1w=~udX<#h8Zq~qXoF*R+BYdR6T@}D%!)k5O zn$74P!PxH5Zl9UCy)rj9LRC)!ESaQ1084nf4^Ivqw#i}FoEILc1#oL>jSyDfH21~; z>>Ecir)FkOQJ&~JVEzlhyouRE?8+KYXM|K3B!=)Bf)2oSS=_x_lDvUvNQKjJ$Rv^X}Q%cW1s1*a1GWfD9d_OE>*k;WX5Qr%<8uh`N+i zDROE;D=6!c7`z)?p3{*xx^_;q= z&*&OnOeCIDpSzC-Z1{p4f<^$b2#BvRh>!spO|>BN`Cc2cJ~lzPomaX55&j`Ei>5jV z4@yfP-Dh~dPXDUx$GO7RCtS2Rjt_KO^S?79y2+FqZZyIurRjVaz4ke0?|=XM-~Vg>``^0=na_7D`A~eu zKNNM_h~_@%r3t)bJ+%ZZv|j%@anb);d8uTViOl(7P1FCjiht?(=ZP{htSQ@`Li06J z>bGw9|L$G?Y?{D4%c^sJv{grwaZXBsY1S>rrWCPxGF6d+QFJy{(DS-}m(stxTbeg_ z({S!OnO<8gI;@9b&F|6Bzc}LU z^l4@J9q&lcnQw2+a0-h5H&A@2q3sQX03uvr^M}*>`V_I;KJ?hBsWkl@TKnJ#A!4RP zvmb0HK;iDaL;awg`_j|X=@CyF>*+(eeO`diZev}QJ!mIQf5d{29sa{a8`OM#Yy;E3 z>__b?9bD<}^9n`7su11X4F$ptMRxzW(o7^D28fJkNCbla`Fj;FLb#=umv2vP2fESz z+2s|U6aM@ky3h9U`c1#x`Xq8uX+iIOW@Y8}{eeESo!VSkW-f~t??3Tu6+Ke23iJtz z2n;Nzi*Mr>J9VA!@W%51^yKpL2g7PRkWssWZHZN^VAq?hzo-oi>}&GNvf z&lDu>Kz^iND^B?S%m};w%DIu0o2|c-V>c>pIo@crr|Okzb8)URHInfpciKtT5#af1)r0b-a)eC#pm8ps*NvxwvaB6r>@NwtwL?Gwf~3Skz1Omo#uVK zM&Azs)z^V4IPn|P0X>1K$Ig#KAKG8pfBBwq_IxyC-cmPL$xaL%xAr#$C;#uPNK#gzo|?Zp*OR-sP8xjYxi2^(ks;}Ei4&%i}a66 zjrqdL%1tAw7Wj@rDf^YdcCgn@VRP;H;lv9sI7d$0ys)~ml*zAB%Y36jKrB#l!u>bF ziCByRWf)3H1?`{)*@B^JAyp3Q=z9AC2V|5cY6p&2Q>hc=9ZwZ9t(B!yCYx4Aa)(KP z;M2g8Ua-pb;!lV59V3zuEuD;lKEczyEvTR)I#WsOF{3 z-U;AaXU}~2J8rr4>S6E6N4?Tp-dU7;iBgZfMqNe#^K0y8V!x8Ag&i-y7yGnY%M|w# z>Xgd6*4p^+0q4+6uG!2@A9N0ArH3&@SJN9C={54S9#-vtizokE$zAdi`-RmG(x-C` ze|q$2UVm%uu3wk=gV*M_*fAcQ7cG>^E1Wbkab#b&j4xYk!x{8t!>MF)C3b^l{Y=)k zEw)%ndT<->Zi4ur>^_~8<>d9Kk7!wTw);L|JJ|DR@U->&v{k_BQ0vvvmcn_`ZKjvm z;%OQyk(8dsvZXR7$E32Hn3T+pNqgx;=4{xSv^lF93!BtL`y$Vp%#h&Z!_sp8N3MNV z&URzvP+hTQFOeeUW$inQkNr^QXSvMvHe-7lYeU9^+>`Bm{%fzRxGKsYQss<#Co|<) zGE=G>I+-btL3_Uydx^d1GEZdJ{jtsTq2kh9^Xk=0?4Z|T(L01Bo2`52mWqecn=f6u zboHv-v5(w0zt1^4!s&z5LZl_&3!_pl{eEG*HZoRNm~70aj!*G-{KWj~3gMys&xNP- zs%$U8xE45ye4N=bx$p}orkc&E6DKeT7Ua1cJ$pAjV~HS$6AnWzHib{YSZVj&?5j+c zOKeiLImN8xekE^sna`EWdfv!*pDX*&(+aixD^-iKYGgQv>+wswm;Z3wNxCKSlsIH5 zDHYw*w8w8UN;+<8m-dXo_9Z{o*J6?{bD9+dfgoW2VS6eFf*tvwf-JwPTPiz5aCDYr zv)H6{TUyPQO8h5dihM5?XY#Z8E6uX6TAVa%*<96}4Ld%=&ulHT6^9Ds4VpPje!s7A zZkJ?l7cL|%29v5B-E-nc%0DK%RpoDAC)wp=!S8tdi7=(+JHxb^y{wnlZ7EuNwAD*P z4Qvdy)JfvmX;CQuar*SJuupwGQuqve*X_k%jlG)80qn>qMewi})Y0;DbH2<6vjsrc7+)QAub;l$gL5 zm`)W^O;XsYk96kBl`HQrr88Mx2MdJ_QZ(rFV+Eb#gVZFt*-$Cs6qUgSFc|E zVwQs(CZxhgJJdHp z6P@q>ESyEh^7(xnTSbyu$x|!iE*Yes=GAJvqC@v;j?{kj z>hYldl@PbX&-Gf7=Yp25UOgYQH4;3gC%-eVYiAwiwX;IdiL{-z38k?o7^jYNo{~7{hZTw zel|5Wn?G=r)L}D6bJNMOpC5x?FOC)`SKGz(jwPko_KtzikY#wKRIpy)p6b*F|Qd`S%*oGmRaFP!+P1v1~) zs)d<}v6jpnD>g#!{+d%hUG|HYl*Q7|GbBNLi+o5MKIir=XyixQ{Odz=bB7Mj&mSxr zv!nUZIsH_=K5L%3V9wSr%^f^AH-GS8V|30qecG6>KVY=#^_Fq6ucaK+J*uRAFsw@8 zi{a_`Diuvza+9>wKC5=?>G^}Iy*K-uV6*R7F28XmpIbj#s@MJX-#$1WG&obp?`v_y z4Wapdy}_proD=KF5%hP8`M6g?x?ig3wp?+R;^ECTSlslyjLy_=V4@X6IxlH#ZY z-a@ym4&cdD7S87bUrTB9LjFSGvna`ut0vH)O|gI&X~}lD`NyBtKK|7AT)UQg<+CqP z!_n9o@~gj{k?0$N3+!7}8^ABfR%|wWOKWrJZqEeTday&~nN#@-pZ!Z^OZi-TBD@Ay z#?N&jf9l%b|K-4QFG0Vhjc2%a`0xKpu0@`EN!(yfpE?)*O4TX3l>Qp8hVZZeZ$ZFu z>5m0L1tEr(Acdiq-97ApJcztL#R$ZHhN`U39+Y*;{_&92&_Dncl z-peJkrH!HXU9#gKD3b}agd`_aNml(R1s>SD$F0z)Q@VDC=Lz#;QiO;04rAh;da0Oq z(M-tug*w1tBOV6`k}h!&vX)uS=Ik^kLz4d_*CG2zCIz0%KKL3~0(*{0m^qad>J1qk zNvAgq(ZOtbW8KS+vO(V(AB4ij9=-K+t>D@5r2))r?A>lJLkkIG2XeFw1Mq(IOV*BU zhrDw8W{sqsEffnw`0&zLNiJywtc}!!&L+|P04A1(@+L&6vsIE&QJHEZ3caJacObEb z;W}=`CpC>cgE@{~p zDJwa{AUr<5|K!|YbNPo-?pq~-AWEkTMC~8lyM>Te(I6w)EdyFbfcYZC6dGE?Fx=^r zt~rO!>Up{GoG6x=f>2~>5U$x&K25G7F6QLCt2_x=gbSw&37KID0s;p{EI4;@FPsF^ zs%dv^OEqxqj+p|)!?3>3ij&+@4HW*0|-WjugtjcKs*W&=< zHVC-DO!Rbw>+-@!a(OcI^4ibwnG516VhGXgCE|BDpr!uPLcO4(e3AgTV|GHSB{ayKW1g>Ft8Yf0F z@H{ax#qpi#B_3O#xu`b^yiCkqb5TgQMx(iqT z=r>|V_J%5gvQ9#4Sn(SW3*XfN3F}%yi^yB89U7Qx4V95&57;A+Nf6GiLZyq? z@rCVOq)VsScPTMr?;>SRT?cm|H@u;oarWdy+kPRF$0?r8h`bR$Mz$bqvb4D?XS$)( z*$6pS|6CH;b7Jp)gc{8Cq)!CZ!$k0wP!MIv?ic6|2``<1-Ouht1c5|C(gs>YM zhGT$+MKay8H~a)8?jur8h#qIWD z>(Jp(FSfTAXAd8;K~mR>h}MsrfxNZ5)xRqiqK%yyvK@w69g;g}e9_jo_Gtaac0&}9 z$M&)q2I1M++hT}9HKyVicEyTVo>BRsMd7$LDlZ1x9_zOgqV0(#w_9r+vuPJ$5N-CO zyIKc>?I(wszML}CqqHFN{BCdvx3^2Z>7v$DqLx7vntLpVlOsvkS>RkTzvARE2_%{G zAUs!G-7oKM6GWksXw}_d3Rriv;b+7W7;MGvSOU>HTlm#jJKwe5H_Dx(EkC@M{yzxK z(Kn+1M;>80 ze6{2Kh(h*VLrk=*>kne@@bz^4DAuksf4d%-j-DTd<=Kwp2{in{_U&N}KicZv7`d@_ zABAFbZ@qp9q9Oj;r`JcJ+hWD}dK4e5hwkp9iOBINpm*L-n;(Q1{(B>BJ_@spBfj8W z=jrt{`6!TUQJ&n@;RgYWGUuoc-w%!0xx4YAo-Dqe{vL(u2RoFuyXHO!o=9(HTkfv8 zN1+rhE?$n^;QV&9_9(Q6Z>X;i0t|B(f6sOF^(f3^tS;^jaRjr&48My+rKJyo(8XCt zOOLh~NC2^LcEi&fl>r?MJ&LO{*VoMlp}e6)=;`KB_(d-4HJ<~m;d+u`kNN!M4K?yX z=mTMKU5z{nwMdPd_rUqyQsaht=;a|1a%89CMf7m5usjI)kSyU?0y$i?=jA3oU_TKL zza6`#&s_QFUz0ii%172>l&(|yuVb%L`mw)NrMF1wTDSDYNNG!zevx~BBvQIhl}f!I zkCgUm_|ZtIwDvUx!zccuYHgzj!XVfc1CSa2Iq_?< zpah0o;P~qRn_rB@X0CkXUg^(A)#`Ns3n=5XBpv1IGWT^27(e@*CSBdw}$* z`LX(VmYh-fV$nopKGTUlx|2wzW(%)$25@d}uJHcv zSu9Ru6So|BvR3FDybfmmj`g=Byc(Iz2z6;CU^u~|j%@YoWt(qD2I;m=$19miAO%l8}%y_)6*$-krp`nBy(X1Mb`?(^mM5{GCDCkyR~_~ z=#{FRoltmaH*94XCpoW0PPSwXHHxi3jzuwZ7nn&DQmci9WB0uC*!^Gv?8oC^!b)T^ zGuJ*-%70FHlj^+{_FiI)g#z{|Y5xW#7I}dp;}#j5pPm`5j?|l@HFAfq)zV%%T^S=v zI-4q<8p6Xvoa;4G^Etqy&a!)9)Jd1c`BATWN+A_45#;|_&Nbmkigf1Oqcc@f)8(>hxKGuqjNkTrhu$v*e6zBqj+6}*3%RS93IJ$|r2{lZ?3S$(63tA#iEE6Z% z>zbD|<+Q9+syc`SK|s+@Io8D086yK4ve^Mxri0T$ck}Ye94tkg2(1mFm?#jZ4{L0K zNaM>Xb8gh3W!EhaLalf$t82ge6cal)|QZYzb7GOXYe#6DzakY^o7?Ld~ zh+zs=!J`l!=Say6yWyDS9@_-+B`3*(sT{8u{<%ylm)yqAAn@no0G-N^3WE4zk3(a! zrjdx-tjlKfS~%gC3A3i>wl#>+)*k(0SxY3KiV|lOC0slT?T@6HPt5LQ0-iJo(Dy76 zRJysDNTzdyOZ3m@;MB+6Xql})vXQ8F#zC|_6@^JA)Y?t8!PcH&;c`h&oYE2rZMe0C zJ^I&aO(`6Q<+vxc;2mxAEy7o~IDIEMu|!vQYxkuT8${3PiHn{$K&g{^v`gHbgz&2k z9!|8i_qTG>t?UHRx%yyBD|1uJGtT(cO*ljUe2|1v`Ny@y zI~3~rYnGMIU1|>5OO!0w3L>PU-k_Igi)1k3q%H#SlOAVEIGF+&0&}~_0wEP|iT6xq z{w_{d^B|vrp6*4b0lO1;0x$+3xL*+{jSIC7;?)jFloqAEemWKVa(4{uA(ucbbH1gp3l-rKh32BByCQ@GAw($F zuJY%0_kB&>RYGVvkUtVP9@SI`3*D72L#E#$gJ{!d;D#ub1T%36_hA3;OBrcz@ve-V z6CG_w;;nY2f214>XUlp-)|854`VjZ{NQUSodm@3An>G>r39Eqyk{@h8nId-4veHSE zB-^ztNs*b1iyqVu&tAHR61ayUe^MEh7>psr-zjseShVAlla4dg{alg*b5|XsTu!b! z@qspH_P{|9z9bugnresF;l4@#!Enkk)I&4w{H8cX7G%a{wgy^L=O7I06)SQAUvOAd zbWq>d@JbHxVkNIJh*JA5*`b@;ch?)lq2%--YkN63PG?-(Aj!u@A8)?I5n!bZ35YcV zYVpW)n)HS=7yHDCyB4#lg0s9_ix(G%T9>^ByHJ$$FBA%W6860lnQApV*~r#vLug!{ zo0ynmm*M~hXLoNw^-Z0WBe?^VbAG39#6IbjEsmTidrjL*#T_%@+2$Zp@86dsf78yJ zGcGz(COOdZ9&)IK?%HlJ?wW zM%gWcaNHtxOC~FJ3j$~4UWp3G3k&i30b!@%4cSa8`~QUseRHeAZB4nkz58n$i*JMor;ZWD`b+IC>vU?VXhZQ^6K5#`KCB$n|U*vh!+p8;%P z-E#(XJO@!tb{OiX1C@nSOA{H_8wBlx_c zSRaAKGuZ9}0~Sw|s>an$)xD^@)9!%PGu-+aW&5N!)mdzxA^!6Y{D&VE+vl{NxLesi zQ5a+eZZ8P>?4RLwFZZmV!Cu$qrdDR`iT7-=6{vrl#n#%Ry`CjB+}2x*lOs3P2AetG zvxlO6!ppc<8&1y#QMzwnj6_VL;ilImuq(}e;G~z*oowFLoSZi#fov$tOE2@D$t>J0 z2mc0IQxq<-QugS31g@@aGz`iuSY57|XQHnSB10g6wrN{h?&qTt6SrsEdquz# zK}fU|`Pfa83UEAoXi=qICq1-78E4RYNky`gO|4p!GKd2Fs^#x5`1HGpOD7VJUoQM+rnE5mUuhb1(^7pw5zx%-NUXXix@D1Gytn$~n z*BpQu5pXSpxC?ouvRJJyss91+fG^K=a3*cs;JKh1bi^F!NBCT)C-NEgrdiNWdWN|xuu08Y|*MjF1 zt;l>(IFs$q=P#ZpKTwkP6g>=GJG&t5spn+Abf0_p(F2Q-=Z3BY&na4w{$cjX_~oRB z$IEo_MXmi}I6rs0e)c)7{akk(UzfAx!?=*32AAHx_+o&kU_5*GsMLU;+Fo>}nO9y^ zxa`~$g=2eBDhc4|T;HXgv(G&j;#|?xuI)fQ&jsTW-ZR)v*q@Mw6g~o4klAwLL>W>E z#z4{7F4vz6$ARmD>j<2i8xOnX6O6`-kvhVAI&G9TpvMzsSDNXzBliGj=N|4juo#77 zk9NSv5G{B zgSjVspbsZf%ZUqTpL?;?ch6uu(wSZz{cvnA9=HJ<-0>(RbX_>O=K$R0I&erkT{yyd zt>6sO6MX9B6A*G|+`_rt>1#mi$C<>(A8;3*>&|1DQ|cbUXuwyXvg2pn(u?7I7TzDu z%Sby++wOcHx_*H9a$PvKVG7$ffa4LUZ2S6f$PFDh)c6x=*PH*UH!`|1y`%Ij@a}aV zqC-%Qme(kBU^ikoe!-s-p zL8af&NA3vv81lP-S8-4=1(sJd=Cu~J@q;$r!7 znL&D`JC0qxBl=A^lI7zvlv-Ol+8HO|w;?6Uoeq>Cl=)G&_*yzRBsupkd~M!BHfuQPjO>c zc3DK>D4`jl93@d@#y<6w z%vqtEKno9{mHXuNsh5Q+mK9k*7h>

    <{RoW5FofFrW|S@A3sGkFN*0 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%0ALkc)T^iT&Ri48db%>N&BHClyk1(aSaDuId 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

    mjBU)H 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≻+MylWe5l^qM;m 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

    emYMX=w58|ze#0^YPf#n14GJ+(7u;JkZd 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

    {n8w|d$+x$v~b3I?t-_G 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

    mLMOhe9=D)q3tG*> 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�%U+>JX(a$trxuKP!9?uJN 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