/* Minetest-c55 Copyright (C) 2011 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 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 General Public License for more details. You should have received a copy of the GNU 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 "scriptapi.h" #include extern "C" { #include #include #include } #include "log.h" #include "server.h" #include "porting.h" #include "filesys.h" #include "serverobject.h" #include "script.h" //#include "luna.h" static void stackDump(lua_State *L, std::ostream &o) { int i; int top = lua_gettop(L); for (i = 1; i <= top; i++) { /* repeat for each level */ int t = lua_type(L, i); switch (t) { case LUA_TSTRING: /* strings */ o<<"\""<= 30){ dstream<<"Stack is over 30:"< stack top // registered_entities[name] = object lua_setfield(L, registered_entities, name); // Get registered object to top of stack lua_pushvalue(L, 2); // Set __index to point to itself lua_pushvalue(L, -1); lua_setfield(L, -2, "__index"); // Set metatable.__index = metatable luaL_getmetatable(L, "minetest.entity"); lua_pushvalue(L, -1); // duplicate metatable lua_setfield(L, -2, "__index"); // Set object metatable lua_setmetatable(L, -2); return 0; /* number of results */ } #if 0 static int l_new_entity(lua_State *L) { /* o = o or {} setmetatable(o, self) self.__index = self return o */ if(lua_isnil(L, -1)) lua_newtable(L); luaL_checktype(L, -1, LUA_TTABLE); luaL_getmetatable(L, "minetest.entity"); lua_pushvalue(L, -1); // duplicate metatable lua_setfield(L, -2, "__index"); lua_setmetatable(L, -2); // return table return 1; } #endif static const struct luaL_Reg minetest_f [] = { {"register_entity", l_register_entity}, //{"new_entity", l_new_entity}, {NULL, NULL} }; static int l_entity_set_deleted(lua_State *L) { return 0; } static const struct luaL_Reg minetest_entity_m [] = { {"set_deleted", l_entity_set_deleted}, {NULL, NULL} }; class ObjectRef { private: ServerActiveObject *m_object; static const char className[]; static const luaL_reg methods[]; static ObjectRef *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 *(ObjectRef**)ud; // unbox pointer } // Exported functions static int l_remove(lua_State *L) { ObjectRef *o = checkobject(L, 1); ServerActiveObject *co = o->m_object; if(co == NULL) return 0; infostream<<"ObjectRef::l_remove(): id="<getId()<m_removed = true; return 0; } static int gc_object(lua_State *L) { //ObjectRef *o = checkobject(L, 1); ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1)); //infostream<<"ObjectRef::gc_object: o="<getId()); // Push id lua_gettable(L, objectstable); // Object is at stack top lua_pop(L, 1); // pop object*/ // Set luaentities[id] = nil lua_pushnumber(L, id); // Push id lua_pushnil(L); lua_settable(L, objectstable); lua_pop(L, 2); // pop luaentities, minetest } void scriptapi_luaentity_step(lua_State *L, u16 id, float dtime) { realitycheck(L); assert(lua_checkstack(L, 20)); infostream<<"scriptapi_luaentity_step: id="<getId()); // Push id lua_pushvalue(L, object); // Copy object to top of stack lua_settable(L, objectstable); // pop object_refs, minetest and the object lua_pop(L, 3); } void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj) { realitycheck(L); assert(lua_checkstack(L, 20)); infostream<<"scriptapi_rm_object_reference: id="<getId()<getId()); // Push id lua_gettable(L, objectstable); // Set object reference to NULL ObjectRef::set_null(L); lua_pop(L, 1); // pop object // Set object_refs[id] = nil lua_pushnumber(L, cobj->getId()); // Push id lua_pushnil(L); lua_settable(L, objectstable); // pop object_refs, minetest lua_pop(L, 2); }