From 69dbc046eb5a82b38c6d5c3302e9b3b0b3c1bcf1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 21 Feb 2011 16:10:36 +0200 Subject: preliminary lua scripting framework for objects --- src/serverobject.cpp | 433 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 429 insertions(+), 4 deletions(-) (limited to 'src/serverobject.cpp') diff --git a/src/serverobject.cpp b/src/serverobject.cpp index ffb6059dc..2fd3a1bfb 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -18,11 +18,14 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "serverobject.h" +#include +#include "environment.h" -ServerActiveObject::ServerActiveObject(u16 id, v3f pos): +ServerActiveObject::ServerActiveObject(ServerEnvironment *env, u16 id, v3f pos): ActiveObject(id), m_known_by_count(0), m_removed(false), + m_env(env), m_base_position(pos) { } @@ -31,8 +34,12 @@ ServerActiveObject::~ServerActiveObject() { } -TestSAO::TestSAO(u16 id, v3f pos): - ServerActiveObject(id, pos), +/* + TestSAO +*/ + +TestSAO::TestSAO(ServerEnvironment *env, u16 id, v3f pos): + ServerActiveObject(env, id, pos), m_timer1(0), m_age(0) { @@ -67,9 +74,427 @@ void TestSAO::step(float dtime, Queue &messages) data += " "; data += itos(m_base_position.Z); - //ActiveObjectMessage aom(getId(), true, data); ActiveObjectMessage aom(getId(), false, data); messages.push_back(aom); } } +/* + LuaSAO +*/ + +extern "C"{ +#include "lstring.h" +} + +/* + object_set_base_position(self, x,y,z) + x,y,z = object_get_base_position(self) + object_add_message(self, data) + object_remove(self) +*/ + +/* + object_set_base_position(self, x, y, z) +*/ +static int lf_object_set_base_position(lua_State *L) +{ + // 4: z + lua_Number z = lua_tonumber(L, -1); + lua_pop(L, 1); + // 3: y + lua_Number y = lua_tonumber(L, -1); + lua_pop(L, 1); + // 2: x + lua_Number x = lua_tonumber(L, -1); + lua_pop(L, 1); + // 1: self + LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + + self->setBasePosition(v3f(x*BS,y*BS,z*BS)); + + return 0; // Number of return values +} + +/* + object_get_base_position(self) +*/ +static int lf_object_get_base_position(lua_State *L) +{ + // 1: self + LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + + v3f pos = self->getBasePosition(); + + lua_pushnumber(L, pos.X/BS); + lua_pushnumber(L, pos.Y/BS); + lua_pushnumber(L, pos.Z/BS); + return 3; // Number of return values +} + +/* + object_add_message(self, string data) + lf = luafunc +*/ +static int lf_object_add_message(lua_State *L) +{ + // 2: data + size_t datalen = 0; + const char *data_c = lua_tolstring(L, -1, &datalen); + lua_pop(L, 1); + // 1: self + LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + assert(data_c); + + std::string data(data_c, datalen); + //dstream<<"object_add_message: data="<getId()); + aom.reliable = true; + aom.datastring = data; + self->m_message_queue.push_back(aom); + + return 0; // Number of return values +} + +/* + object_get_node(x,y,z) +*/ +static int lf_object_get_node(lua_State *L) +{ + // 4: z + lua_Number z = lua_tonumber(L, -1); + lua_pop(L, 1); + // 3: y + lua_Number y = lua_tonumber(L, -1); + lua_pop(L, 1); + // 2: x + lua_Number x = lua_tonumber(L, -1); + lua_pop(L, 1); + // 1: self + LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + + v3s16 pos = floatToInt(v3f(x,y,z), 1.0); + + /*dstream<<"Checking node from pos=("<getEnv()->getMap().getNodeNoEx(pos); + + // Create a table with some data about the node + lua_newtable(L); + lua_pushstring(L, "content"); + lua_pushinteger(L, n.d); + lua_settable(L, -3); + lua_pushstring(L, "walkable"); + lua_pushboolean(L, content_features(n.d).walkable); + lua_settable(L, -3); + + // Return the table + return 1; +} + +/* + object_remove(x,y,z) +*/ +static int lf_object_remove(lua_State *L) +{ + // 1: self + LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); + lua_pop(L, 1); + + assert(self); + + self->m_removed = true; + + return 0; +} + +LuaSAO::LuaSAO(ServerEnvironment *env, u16 id, v3f pos): + ServerActiveObject(env, id, pos), + L(NULL) +{ + dstream<<"LuaSAO::LuaSAO(): id="< buf(size); + file.seekg(0, std::ios::beg); + file.read(&buf[0], size); + file.close(); + + /* + Create data string + */ + std::string data; + + // Append script + std::string script_string(&buf[0], buf.getSize()); + data += serializeLongString(script_string); + + /* + Get data from server-side script for inclusion + */ + std::string other_data; + + do{ + + const char *funcname = "get_client_init_data"; + lua_getglobal(L, funcname); + if(!lua_isfunction(L,-1)) + { + lua_pop(L,1); + dstream<<"WARNING: LuaSAO: Function not found: " + < &messages) +{ + lua_getglobal(L, "step"); + if(!lua_isfunction(L,-1)) + { + lua_pop(L,1); + dstream<<"WARNING: LuaSAO::step(): step function not found"<