X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserverobject.cpp;h=ce19ea34f10a85d7b46aa1a8038e0dde24b7d777;hb=9b907dd65a2c045d10605894fdaea504200e2be7;hp=2fd3a1bfb16e52a7e28239807749264b95dd7bde;hpb=69dbc046eb5a82b38c6d5c3302e9b3b0b3c1bcf1;p=minetest.git diff --git a/src/serverobject.cpp b/src/serverobject.cpp index 2fd3a1bfb..ce19ea34f 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -19,12 +19,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serverobject.h" #include -#include "environment.h" +#include "inventory.h" ServerActiveObject::ServerActiveObject(ServerEnvironment *env, u16 id, v3f pos): ActiveObject(id), m_known_by_count(0), m_removed(false), + m_pending_deactivation(false), + m_static_exists(false), + m_static_block(1337,1337,1337), m_env(env), m_base_position(pos) { @@ -34,466 +37,33 @@ ServerActiveObject::~ServerActiveObject() { } -/* - TestSAO -*/ - -TestSAO::TestSAO(ServerEnvironment *env, u16 id, v3f pos): - ServerActiveObject(env, id, pos), - m_timer1(0), - m_age(0) +ServerActiveObject* ServerActiveObject::create(u8 type, + ServerEnvironment *env, u16 id, v3f pos, + const std::string &data) { -} - -void TestSAO::step(float dtime, Queue &messages) -{ - m_age += dtime; - if(m_age > 10) - { - m_removed = true; - return; - } - - m_base_position.Y += dtime * BS * 2; - if(m_base_position.Y > 8*BS) - m_base_position.Y = 2*BS; - - m_timer1 -= dtime; - if(m_timer1 < 0.0) + // Find factory function + core::map::Node *n; + n = m_types.find(type); + if(n == NULL) { - m_timer1 += 0.125; - //dstream<<"TestSAO: id="<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 + Factory f = n->getValue(); + ServerActiveObject *object = (*f)(env, id, pos, data); + return object; } -/* - object_get_node(x,y,z) -*/ -static int lf_object_get_node(lua_State *L) +void ServerActiveObject::registerType(u16 type, Factory f) { - // 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: " - <::Node *n; + n = m_types.find(type); + if(n) return; - } - - // Parameters: - // 1: self - lua_pushlightuserdata(L, this); - // 2: data (other) - lua_pushlstring(L, other.c_str(), other.size()); - - // Call (2 parameters, 0 result) - if(lua_pcall(L, 2, 0, 0)) - { - dstream<<"WARNING: LuaSAO: Error running function " - < &messages) -{ - lua_getglobal(L, "step"); - if(!lua_isfunction(L,-1)) - { - lua_pop(L,1); - dstream<<"WARNING: LuaSAO::step(): step function not found"<