aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_object.cpp
Commit message (Expand)AuthorAge
* Fix crash when attached object no longer existsRogier2016-11-13
* Fix overloading problems mentioned by clangLoic Blot2016-10-30
* PlayerSAO/LocalPlayer refactor: (#4612)Ner'zhul2016-10-30
* Adding LuaError on attempt to assign vectors with values out of rangeFoghrye42016-10-25
* Move RemotePlayer code to its own cpp/headerLoic Blot2016-10-08
* RemotePlayer/LocalPlayer Player base class proper separation (code cleanup) (...Loic Blot2016-10-08
* More code cleanup (UNORDERED + RemotePlayer/LocalPlayer)Loic Blot2016-10-08
* Player/LocalPlayer/RemotePlayer inheritance cleanup (part 2 on X)Loic Blot2016-10-08
* Prevent attached models from disappearing during parent reload (#4128)Foghrye42016-10-08
* Player/LocalPlayer/RemotePlayer inheritance cleanup (part 1 on X)Loic Blot2016-10-08
* Player: New get_look, set_look APIraymoo2016-06-24
* Add option to give every object a nametagBlockMen2015-12-15
* SAPI: Mark all Lua API functions requiring envlockkwolekr2015-10-25
* Define and use limit constants for Irrlicht fixed-width typeskwolekr2015-10-04
* minimap: Add ability to disable from serverkwolekr2015-08-13
* Added get_player_velocity() method. Fixes #1176Elia Argentieri2015-07-20
* Fix invisible player when the attached entity is removedTeTpaAka2015-07-18
* Fix damage flash when damage disabledkwolekr2015-07-10
* Fix some issues with animations, and allow non-looped animations to be definedMirceaKitsune2015-06-22
* Add some missing getter functions to the lua APITeTpaAka2015-05-28
* SAPI: Accept either ARGB8 table or ColorString to specify colorskwolekr2015-05-16
* Add push_ARGB8 to script/common/c_converterTeTpaAka2015-05-15
* Generalize core.get/set_nametag_color into core.get/set_nametag_attributesTeTpaAka2015-05-15
* Add get and set functions for the nametag colorTeTpaAka2015-05-15
* is_player() is no player-only functionest312015-05-12
* Revert "Add a Lua call to do damages / heals" ok @ShadowNinjaLoic Blot2015-03-22
* Add a Lua call to do damages / healsLoic Blot2015-03-18
* We always know playerSAO when calling SendInventory. Using it instead of sear...Loic Blot2015-03-04
* Send Inventory packet on event, don't check it at each AsyncRunStep.Loic Blot2015-03-04
* Send Breath packet on event, don't check it at each AsyncRunStepLoic Blot2015-03-03
* Send Player HP when setHP (or a setHP caller) is called instead of looping an...Loic Blot2015-03-03
* Disallow object:remove() if the object is a playerKahrl2015-02-23
* SAO work: ActiveObject types & SAO cleanup * Replace u8 types with ActiveObje...Loic Blot2015-02-17
* Fix direction property of HUDrubenwardy2015-01-07
* Check minetest.hud_change() parameters on conversion (Fix #1714)kwolekr2014-10-30
* Small cleanup of hud add/remove codesapier2014-05-31
* Fix heart + bubble bar size on different texture packssapier2014-05-07
* Add proper lua api deprecated handlingsapier2014-04-29
* Use integers instead of float valuesBlockMen2014-04-12
* Add player:set_eye_offset() by @MirceaKitsune and clean upBlockMen2014-04-12
* Add third person viewBlockMen2014-04-12
* Remove lua_State parameter from LuaError::LuaErrorShadowNinja2014-03-15
* Add player:override_day_night_ratio() for arbitrarily controlling sunlight br...Perttu Ahola2014-02-01
* Add player:set_sky() with simple skybox supportPerttu Ahola2014-02-01
* New HUD element - waypoint.RealBadAngel2014-01-26
* Fix some errors reported by clang static analyzer.Ilya Zhuravlev2014-01-13
* Fix enum element name in Lua HUD code (position vs. pos)kaeza2013-12-31
* Use a table in set_physics_override()PilzAdam2013-12-03
* Add sneak and sneak_glitch to set_physics_override()PilzAdam2013-12-03
* Fix issue #1009 (minetest.get_connected_players() returns non-existing players)kwolekr2013-11-17
span> m_env->getMap().dispatchEvent(&event); // Set the block to be saved MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos); if (block) { block->raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_REPORT_META_CHANGE); } } // 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(lua_tostring(L, -1), true); // removes value, keeps key for next iteration lua_pop(L, 1); } } else if (lua_isstring(L, 2)) { meta->markPrivate(lua_tostring(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 = 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); } 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, 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, get_string), luamethod(MetaDataRef, get_int), luamethod(MetaDataRef, get_float), luamethod(MetaDataRef, to_table), {0,0} };