From bfc68d31510bbd40732c19ada51d4683cb050de2 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Fri, 11 Nov 2011 19:33:17 +0200 Subject: Scripting WIP --- src/scriptapi.cpp | 422 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) create mode 100644 src/scriptapi.cpp (limited to 'src/scriptapi.cpp') diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp new file mode 100644 index 000000000..fbe383075 --- /dev/null +++ b/src/scriptapi.cpp @@ -0,0 +1,422 @@ +/* +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:"<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, cobj->getId()); // 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, bool send_recommended) +{ + realitycheck(L); + assert(lua_checkstack(L, 20)); + infostream<<"scriptapi_luaentity_step: id="<getId()); // Push id + lua_gettable(L, objectstable); + + // TODO: Call step function + + lua_pop(L, 1); // pop object + lua_pop(L, 2); // pop luaentities, minetest +} + +std::string scriptapi_luaentity_get_state(lua_State *L, u16 id) +{ + realitycheck(L); + assert(lua_checkstack(L, 20)); + infostream<<"scriptapi_luaentity_get_state: 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); +} + -- cgit v1.2.3