aboutsummaryrefslogtreecommitdiff
path: root/src/utility.h
Commit message (Expand)AuthorAge
* Chat console, including a number of rebases and modifications.Kahrl2012-03-10
* F1 toggles HUD, F2 toggles chat, F5 toggles debug info, F6 toggles profiler p...Kahrl2012-02-01
* The huge item definition and item namespace unification patch (itemdef), see ...Kahrl2012-01-12
* inventorycube: use all three specified textures; also moved mesh creation / m...Kahrl2011-12-03
* CraftItem rework and Lua interfaceKahrl2011-11-29
* Some MSVC fixesPerttu Ahola2011-11-29
* Improve luaentity sprite functionality (and add some random stuff)Perttu Ahola2011-11-29
* Improve item serializationPerttu Ahola2011-11-29
* Completely generalized mesh generation; ContentFeatures serializationPerttu Ahola2011-11-29
* Fix yet-another serialization error in utility.h and set constructor of Buffe...Perttu Ahola2011-11-29
* utility.h: Change Buffer's interface to be more compatible with SharedBuffer'...Kahrl2011-11-07
* Fix an obvious bug in utility.hPerttu Ahola2011-11-01
* Use the logger; also, default to not showing much crap in console. Use --info...Perttu Ahola2011-10-16
* mobv2Perttu Ahola2011-10-15
* Header file tweaking; mainly for speedPerttu Ahola2011-10-12
* Simplistic wielded tool lighting, added setMeshVerticesColor to utility.h and...Kahrl2011-09-21
* Collected and moved existing camera infrastructure from game.cpp to camera.cp...Kahrl2011-09-08
* Fix byte count in serialization of "F1000"Perttu Ahola2011-08-22
* Let Settings accept a const char* directlyGiuseppe Bilotta2011-08-13
* Always return from non-void functionsGiuseppe Bilotta2011-08-08
* mapgen stuffPerttu Ahola2011-06-25
* Reduced the CPU usage of the sent block selector algorithmPerttu Ahola2011-05-31
* player passwords and privileges in world/auth.txtPerttu Ahola2011-05-29
* Added the ability to change your password (via pause menu)Ciaran Gultnieks2011-05-22
* Preliminary "active block" stuff + set up test code to grow grass.Perttu Ahola2011-05-22
* Cleaned networking code a bit (had this one on the to-do list for like 4 mont...Perttu Ahola2011-05-21
* All textures are are now searched first from the directory specified by the t...Perttu Ahola2011-05-21
* put the wstring stoi too in the ignore-on-vc2010 #ifPerttu Ahola2011-05-19
* (hopefully) fixed stoi/stof compile problems on vc2010Perttu Ahola2011-05-18
* Improved server commands and added player permissions.Ciaran Gultnieks2011-05-16
* Fixed a temporary solution of server shutting down to an assert(0) when a too...Perttu Ahola2011-05-03
* made proper skyboxes for dawn/evening and nightPerttu Ahola2011-04-29
* Removed IrrlichtWrapperPerttu Ahola2011-04-22
* Some work-in-progress in hp and mobs and a frightening amount of random fixes.Perttu Ahola2011-04-21
* Fixed some problems with crafting and inventoryPerttu Ahola2011-04-11
* fixed warnings reported by cppcheckPerttu Ahola2011-04-11
* fixed the object update interval thingyPerttu Ahola2011-04-10
* better support for old mapsPerttu Ahola2011-04-10
* implemented rats in new system to verify that it worksPerttu Ahola2011-04-10
* new object systemPerttu Ahola2011-04-10
* Made a proper queued thread to client for handling some block mesh updates. A...Perttu Ahola2011-04-04
* Modified block mesh generation to have clearer input and output. Instead of b...Perttu Ahola2011-04-03
* commit before some radical changesPerttu Ahola2011-04-02
* A third try on terrain generation. No trees yet.Perttu Ahola2011-02-28
* mainly work on object scripting apiPerttu Ahola2011-02-23
* removed an old commentPerttu Ahola2011-02-23
* Fixed insufficient error handling in narrow_to_wide, which caused a crash if ...Perttu Ahola2011-02-23
* preliminary lua scripting framework for objectsPerttu Ahola2011-02-21
* Temporary commit; lots of test code and stuffPerttu Ahola2011-02-21
* Ctrl+C handling on POSIX, some commands for server and other tweakingPerttu Ahola2011-02-15
class="hl opt">} NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, 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()); if(!ref->m_env->getMap().setNodeMetadata(ref->m_p, meta)) { delete meta; return NULL; } } return meta; } void NodeMetaRef::reportMetadataChange(NodeMetaRef *ref) { // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed v3s16 blockpos = getNodeBlockPos(ref->m_p); MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.p = blockpos; ref->m_env->getMap().dispatchEvent(&event); // Set the block to be saved MapBlock *block = ref->m_env->getMap().getBlockNoCreateNoEx(blockpos); if(block) block->raiseModified(MOD_STATE_WRITE_NEEDED, "NodeMetaRef::reportMetadataChange"); } // Exported functions // garbage collector int NodeMetaRef::gc_object(lua_State *L) { NodeMetaRef *o = *(NodeMetaRef **)(lua_touserdata(L, 1)); delete o; return 0; } // get_string(self, name) 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); 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) { 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 = getmeta(ref, !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) { NodeMetaRef *ref = checkobject(L, 1); std::string name = lua_tostring(L, 2); NodeMetadata *meta = getmeta(ref, 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) { 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 = getmeta(ref, 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) { NodeMetaRef *ref = checkobject(L, 1); std::string name = lua_tostring(L, 2); NodeMetadata *meta = getmeta(ref, 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) { 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 = getmeta(ref, 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) { NodeMetaRef *ref = checkobject(L, 1); getmeta(ref, true); // try to ensure the metadata exists InvRef::createNodeMeta(L, ref->m_p); return 1; } // to_table(self) int NodeMetaRef::l_to_table(lua_State *L) { NodeMetaRef *ref = checkobject(L, 1); NodeMetadata *meta = getmeta(ref, true); if(meta == NULL){ lua_pushnil(L); return 1; } lua_newtable(L); // fields lua_newtable(L); { std::map<std::string, std::string> fields = meta->getStrings(); for(std::map<std::string, std::string>::const_iterator i = fields.begin(); i != fields.end(); i++){ const std::string &name = i->first; const std::string &value = i->second; lua_pushlstring(L, name.c_str(), name.size()); lua_pushlstring(L, value.c_str(), value.size()); lua_settable(L, -3); } } lua_setfield(L, -2, "fields"); // 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"); return 1; } // from_table(self, table) int NodeMetaRef::l_from_table(lua_State *L) { NodeMetaRef *ref = checkobject(L, 1); int base = 2; // clear old metadata first ref->m_env->getMap().removeNodeMetadata(ref->m_p); if(lua_isnil(L, base)){ // No metadata lua_pushboolean(L, true); return 1; } // Create new metadata NodeMetadata *meta = getmeta(ref, true); 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 } // 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 } reportMetadataChange(ref); lua_pushboolean(L, true); return 1; } NodeMetaRef::NodeMetaRef(v3s16 p, ServerEnvironment *env): m_p(p), m_env(env) { } NodeMetaRef::~NodeMetaRef() { } // 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); } void NodeMetaRef::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, "__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 // Cannot be created from Lua //lua_register(L, className, create_object); } 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(NodeMetaRef, get_inventory), luamethod(NodeMetaRef, to_table), luamethod(NodeMetaRef, from_table), {0,0} };