aboutsummaryrefslogtreecommitdiff
Commit message (Expand)AuthorAge
...
* Translated using Weblate (Czech)Jakub Vaněk2016-12-14
* Translated using Weblate (Czech)Tomáš Bělohlávek2016-12-14
* Translated using Weblate (Chinese (Taiwan))Jeff Huang2016-12-14
* Translated using Weblate (Chinese (Taiwan))Mingye Wang2016-12-14
* Translated using Weblate (Catalan)tonibm192016-12-14
* Translated using Weblate (Catalan)Roc Humet2016-12-14
* Translated using Weblate (Spanish)Alfonso R. Zepeda R2016-12-14
* Translated using Weblate (Japanese)Rui2016-12-14
* Translated using Weblate (Swahili)Eidy2016-12-14
* Added translation using Weblate (Swahili)Eidy2016-12-14
* Translated using Weblate (Portuguese)João Rodrigues2016-12-14
* Translated using Weblate (Portuguese (Brazil))José Henrique Luckmann2016-12-14
* Translated using Weblate (Danish)Thomas Wagner Nielsen2016-12-14
* Translated using Weblate (Danish)Joe Hansen2016-12-14
* Translated using Weblate (Danish)Thomas Wagner Nielsen2016-12-13
* Mgv7: Change default cave width to 0.09sfan52016-12-13
* Fix segfault on startup error on Androidrubenwardy2016-12-12
* Fix camera jumping on Android when panning past 0/360 markrubenwardy2016-12-12
* Mod dependency lists: Should have platform-independent line breakingBernardo Sulzbach2016-12-12
* Setting limits: Fix message text in advanced settings tabRogier2016-12-12
* View range: Set maximum to 4000 nodesRogier2016-12-12
* Mapgen: Make mgv7 the default mapgenparamat2016-12-12
* Fix computation of viewing range (in blocks) sent to server (#4882)Rogier-52016-12-11
* Fix sqlite databases being read-only on 64bit Android by patching sqlite (#4871)rubenwardy2016-12-09
* Buildbot: Update LuaJIT versionsfan52016-12-08
* Simple decorations: Fix range check for deco->deco_param2Auke Kok2016-12-08
* Android: fix build and update depsest312016-12-07
* Update credits (#4827)Zeno-2016-12-07
* Simple deco: Allow setting param2 value on placementAuke Kok2016-12-07
* Fog: Make fraction of visible distance at which fog starts configurableLars Hofhansl2016-12-07
* Liquids: Update flow on block loadMillersMan2016-12-07
* Liquids: Preserve flow state if 'ignore' is a neighbourMillersMan2016-12-07
* Map::isValidPosition: Return false instead of throwing exceptionMillersMan2016-12-07
* Optimize block sent: Fix rendering issueLars Hofhansl2016-12-03
* Biomes: Increase heat and humidity noise spread to 1000paramat2016-12-03
* Don't send a join message in singleplayer mode.red-0012016-12-03
* Fix incorrect docs about minetest.hud_replace_builtin (#4833)Amaz2016-12-02
* Very small documentation fix. (#4830)Bluebird2016-12-02
* Lua_api.txt: Clarify use of looping soundsparamat2016-12-01
* Mgv7 floatlands: Various improvementsparamat2016-12-01
* Optimize/adjust blocks/ActiveObjects sent at the server based on client setti...lhofhansl2016-11-30
* Allow restricting detached inventories to one playersfan52016-11-28
* Limit light_source in the engine (#4814)juhdanad2016-11-28
* Fix filepath > RemoveRelativePathComponent unittestsfan52016-11-27
* Wieldhand: Allow overriding the handTeTpaAka2016-11-26
* Fix fs::RemoveRelativePathComponents for paths with a leading dot componentShadowNinja2016-11-24
* Fix secure io.linesShadowNinja2016-11-24
* Fix secure io.open without modeShadowNinja2016-11-24
* Make supplying empty formspec strings close the formspec (#4737)orwell962016-11-23
* No functional changes. Credit gcuZeno-2016-11-23
"hl opt">); if (meta == NULL && auto_create) { meta = new NodeMetadata(m_env->getGameDef()->idef()); if (!m_env->getMap().setNodeMetadata(m_p, meta)) { delete meta; return NULL; } } return meta; } void NodeMetaRef::clearMeta() { SANITY_CHECK(!m_is_local); m_env->getMap().removeNodeMetadata(m_p); } void NodeMetaRef::reportMetadataChange(const std::string *name) { SANITY_CHECK(!m_is_local); // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed NodeMetadata *meta = dynamic_cast<NodeMetadata*>(m_meta); MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.p = m_p; event.is_private_change = name && meta && meta->isPrivate(*name); m_env->getMap().dispatchEvent(event); } // Exported functions // garbage collector int NodeMetaRef::gc_object(lua_State *L) { NodeMetaRef *o = *(NodeMetaRef **)(lua_touserdata(L, 1)); delete o; return 0; } // get_inventory(self) int NodeMetaRef::l_get_inventory(lua_State *L) { MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); ref->getmeta(true); // try to ensure the metadata exists InvRef::createNodeMeta(L, ref->m_p); return 1; } // mark_as_private(self, <string> or {<string>, <string>, ...}) int NodeMetaRef::l_mark_as_private(lua_State *L) { MAP_LOCK_REQUIRED; NodeMetaRef *ref = checkobject(L, 1); NodeMetadata *meta = dynamic_cast<NodeMetadata*>(ref->getmeta(true)); assert(meta); if (lua_istable(L, 2)) { lua_pushnil(L); while (lua_next(L, 2) != 0) { // key at index -2 and value at index -1 luaL_checktype(L, -1, LUA_TSTRING); meta->markPrivate(readParam<std::string>(L, -1), true); // removes value, keeps key for next iteration lua_pop(L, 1); } } else if (lua_isstring(L, 2)) { meta->markPrivate(readParam<std::string>(L, 2), true); } ref->reportMetadataChange(); return 0; } void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta) { // fields MetaDataRef::handleToTable(L, _meta); NodeMetadata *meta = (NodeMetadata*) _meta; // inventory lua_newtable(L); Inventory *inv = meta->getInventory(); if (inv) { std::vector<const InventoryList *> lists = inv->getLists(); for(std::vector<const InventoryList *>::const_iterator i = lists.begin(); i != lists.end(); ++i) { push_inventory_list(L, inv, (*i)->getName().c_str()); lua_setfield(L, -2, (*i)->getName().c_str()); } } lua_setfield(L, -2, "inventory"); } // from_table(self, table) bool NodeMetaRef::handleFromTable(lua_State *L, int table, Metadata *_meta) { // fields if (!MetaDataRef::handleFromTable(L, table, _meta)) return false; NodeMetadata *meta = (NodeMetadata*) _meta; // inventory Inventory *inv = meta->getInventory(); lua_getfield(L, table, "inventory"); 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 = luaL_checkstring(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); } return true; } NodeMetaRef::NodeMetaRef(v3s16 p, ServerEnvironment *env): m_p(p), m_env(env) { } NodeMetaRef::NodeMetaRef(Metadata *meta): m_meta(meta), m_is_local(true) { } // Creates an NodeMetaRef and leaves it on top of stack // Not callable from Lua; all references are created on the C side. void NodeMetaRef::create(lua_State *L, v3s16 p, ServerEnvironment *env) { NodeMetaRef *o = new NodeMetaRef(p, env); //infostream<<"NodeMetaRef::create: o="<<o<<std::endl; *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); lua_setmetatable(L, -2); } // Client-sided version of the above void NodeMetaRef::createClient(lua_State *L, Metadata *meta) { NodeMetaRef *o = new NodeMetaRef(meta); *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); lua_setmetatable(L, -2); } const char NodeMetaRef::className[] = "NodeMetaRef"; void NodeMetaRef::RegisterCommon(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_pushliteral(L, "__eq"); lua_pushcfunction(L, l_equals); lua_settable(L, metatable); lua_pop(L, 1); // drop metatable } void NodeMetaRef::Register(lua_State *L) { RegisterCommon(L); luaL_openlib(L, 0, methodsServer, 0); // fill methodtable lua_pop(L, 1); // drop methodtable } const luaL_Reg NodeMetaRef::methodsServer[] = { luamethod(MetaDataRef, contains), luamethod(MetaDataRef, get), 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, mark_as_private), luamethod(MetaDataRef, equals), {0,0} }; void NodeMetaRef::RegisterClient(lua_State *L) { RegisterCommon(L); luaL_openlib(L, 0, methodsClient, 0); // fill methodtable lua_pop(L, 1); // drop methodtable } const luaL_Reg NodeMetaRef::methodsClient[] = { luamethod(MetaDataRef, contains), luamethod(MetaDataRef, get), luamethod(MetaDataRef, get_string), luamethod(MetaDataRef, get_int), luamethod(MetaDataRef, get_float), luamethod(MetaDataRef, to_table), {0,0} };