From: sapier Date: Sat, 4 Feb 2012 11:41:25 +0000 (+0100) Subject: Merge remote branch 'upstream/master' into sapier_experimental X-Git-Tag: 20120204_luaentity_allfaces~1 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=77df09540c4d7eadef760779e123af88a48aafaa;p=oweals%2Fminetest.git Merge remote branch 'upstream/master' into sapier_experimental Conflicts: src/scriptapi.cpp --- 77df09540c4d7eadef760779e123af88a48aafaa diff --cc src/CMakeLists.txt index baf9fed5a,ee02d66f0..a736991b4 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@@ -115,9 -114,7 +114,8 @@@ set(common_SRC collision.cpp nodemetadata.cpp serverobject.cpp + serverlinkableobject.cpp noise.cpp - mineral.cpp porting.cpp materials.cpp defaultsettings.cpp diff --cc src/content_sao.cpp index b8189b258,02be64c64..4a2bef872 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@@ -24,9 -24,11 +24,9 @@@ with this program; if not, write to th #include "main.h" // For g_profiler #include "profiler.h" #include "serialization.h" // For compressZlib - #include "materials.h" // For MaterialProperties - #include "tooldef.h" // ToolDiggingProperties + #include "materials.h" // For MaterialProperties and ToolDiggingProperties + #include "gamedef.h" -core::map ServerActiveObject::m_types; - /* Some helper functions */ // Y is copied, X and Z change is limited diff --cc src/scriptapi.cpp index 39a3b06ff,a064cd688..23063a3c8 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@@ -2602,35 -2913,38 +2972,67 @@@ private return 1; } + // EnvRef:get_objects_inside_radius(pos, radius) + static int l_get_nodes_inside_radius(lua_State *L) + { + // Get the table insert function + lua_getglobal(L, "table"); + lua_getfield(L, -1, "insert"); + int table_insert = lua_gettop(L); + // Get environemnt + EnvRef *o = checkobject(L, 1); + ServerEnvironment *env = o->m_env; + if(env == NULL) return 0; + // Do it + v3s16 pos = read_v3s16(L, 2); + float radius = luaL_checknumber(L, 3);// * BS; + core::list nodes = env->getNodesInsideRadius(pos, radius); + lua_newtable(L); + int table = lua_gettop(L); + for(core::list::Iterator + i = nodes.begin(); i != nodes.end(); i++){ + // Insert object reference into table + lua_pushvalue(L, table_insert); + lua_pushvalue(L, table); + pushnode(L, *i, env->getGameDef()->ndef()); + if(lua_pcall(L, 2, 0, 0)) + script_error(L, "error: %s", lua_tostring(L, -1)); + } + return 1; + } + + // EnvRef:set_timeofday(val) + // val = 0...1 + static int l_set_timeofday(lua_State *L) + { + EnvRef *o = checkobject(L, 1); + ServerEnvironment *env = o->m_env; + if(env == NULL) return 0; + // Do it + float timeofday_f = luaL_checknumber(L, 2); + assert(timeofday_f >= 0.0 && timeofday_f <= 1.0); + int timeofday_mh = (int)(timeofday_f * 24000.0); + // This should be set directly in the environment but currently + // such changes aren't immediately sent to the clients, so call + // the server instead. + //env->setTimeOfDay(timeofday_mh); + get_server(L)->setTimeOfDay(timeofday_mh); + return 0; + } + + // EnvRef:get_timeofday() -> 0...1 + static int l_get_timeofday(lua_State *L) + { + EnvRef *o = checkobject(L, 1); + ServerEnvironment *env = o->m_env; + if(env == NULL) return 0; + // Do it + int timeofday_mh = env->getTimeOfDay(); + float timeofday_f = (float)timeofday_mh / 24000.0; + lua_pushnumber(L, timeofday_f); + return 1; + } + static int gc_object(lua_State *L) { EnvRef *o = *(EnvRef **)(lua_touserdata(L, 1)); delete o; @@@ -2708,7 -3022,8 +3110,9 @@@ const luaL_reg EnvRef::methods[] = method(EnvRef, get_meta), method(EnvRef, get_player_by_name), method(EnvRef, get_objects_inside_radius), + method(EnvRef, get_nodes_inside_radius), + method(EnvRef, set_timeofday), + method(EnvRef, get_timeofday), {0,0} }; diff --cc src/serverobject.cpp index b5fd6fc3a,2609e3015..76a70ca5b --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@@ -58,19 -58,40 +58,40 @@@ ServerActiveObject* ServerActiveObject: return object; } -void ServerActiveObject::registerType(u16 type, Factory f) +void ServerActiveObject::registerType(u8 type, Factory f) { - core::map::Node *n; - n = m_types.find(type); + core::map::Node *n; + n = ServerActiveObject::getTypes().find(type); if(n) return; - m_types.insert(type, f); + ServerActiveObject::getTypes().insert(type, f); } - void ServerActiveObject::getWieldDiggingProperties(ToolDiggingProperties *dst) + ItemStack ServerActiveObject::getWieldedItem() const { - *dst = ToolDiggingProperties(); + const Inventory *inv = getInventory(); + if(inv) + { + const InventoryList *list = inv->getList(getWieldList()); + if(list) + return list->getItem(getWieldIndex()); + } + return ItemStack(); } - + bool ServerActiveObject::setWieldedItem(const ItemStack &item) + { + Inventory *inv = getInventory(); + if(inv) + { + InventoryList *list = inv->getList(getWieldList()); + if (list) + { + list->changeItem(getWieldIndex(), item); + setInventoryModified(); + return true; + } + } + return false; + }