X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Fserverobject.cpp;h=236d7e8dc06feaaca81fedb4c3479fc87ed3d103;hb=d1df09841d0eac7a88f638676b80ec848522cca5;hp=8b41cef1684456d1861691439e87423e13c699cf;hpb=62e79125775123f1889131b42caaeeb5f1cf015a;p=dragonfireclient.git diff --git a/src/serverobject.cpp b/src/serverobject.cpp index 8b41cef16..236d7e8dc 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -1,30 +1,34 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 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 +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 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. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser 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 "serverobject.h" #include -#include "environment.h" +#include "inventory.h" +#include "constants.h" // BS -ServerActiveObject::ServerActiveObject(ServerEnvironment *env, u16 id, v3f pos): - ActiveObject(id), +ServerActiveObject::ServerActiveObject(ServerEnvironment *env, v3f pos): + ActiveObject(0), 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,548 +38,64 @@ ServerActiveObject::~ServerActiveObject() { } -/* - TestSAO -*/ - -TestSAO::TestSAO(ServerEnvironment *env, u16 id, v3f pos): - ServerActiveObject(env, id, pos), - m_timer1(0), - m_age(0) -{ -} - -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) - { - 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 -} - -/* - object_get_node(self, 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, "param1"); - lua_pushinteger(L, n.param); - lua_settable(L, -3); - lua_pushstring(L, "param2"); - lua_pushinteger(L, n.param2); - 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; -} - -#if 0 -/* - object_set_node(self, x,y,z, n) -*/ -static int lf_object_set_node(lua_State *L) -{ - MapNode n; - - // 5: n - // Get fields of table - - lua_pushinteger(L, "content"); - lua_gettable(L, -2); - n.d = lua_tonumber(L, -1); - lua_pop(L, 1); - - lua_pushinteger(L, "param1"); - lua_gettable(L, -2); - n.param = lua_tonumber(L, -1); - lua_pop(L, 1); - - lua_pushinteger(L, "param2"); - lua_gettable(L, -2); - n.param2 = lua_tonumber(L, -1); - lua_pop(L, 1); - - lua_pop(L, 1); - // 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; -} -#endif - -/* - 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: " - <::iterator n; + n = m_types.find(type); + if(n == m_types.end()) { + // These are 0.3 entity types, return without error. + if (ACTIVEOBJECT_TYPE_ITEM <= type && type <= ACTIVEOBJECT_TYPE_MOBV2) { + return NULL; } - // Retrieve result - if(!lua_isstring(L,-1)) - { - dstream<<"WARNING: LuaSAO: Function "<::iterator n; + n = m_types.find(type); + if(n != m_types.end()) + return; + m_types[type] = f; } -void LuaSAO::initialize(const std::string &data) +float ServerActiveObject::getMinimumSavedMovement() { - std::istringstream is(data, std::ios::binary); - std::string script_name = deSerializeString(is); - std::string other = deSerializeLongString(is); - - loadScripts(script_name); - - /* - Call initialize(self, data) in the script - */ - - const char *funcname = "initialize"; - lua_getglobal(L, funcname); - if(!lua_isfunction(L,-1)) - { - lua_pop(L,1); - dstream<<"WARNING: LuaSAO: Function not found: " - <getList(getWieldList()); + if(list && (getWieldIndex() < (s32)list->getSize())) + return list->getItem(getWieldIndex()); } + return ItemStack(); } -void LuaSAO::step(float dtime, Queue &messages) +bool ServerActiveObject::setWieldedItem(const ItemStack &item) { - lua_getglobal(L, "step"); - if(!lua_isfunction(L,-1)) - { - lua_pop(L,1); - dstream<<"WARNING: LuaSAO::step(): step function not found"<getList(getWieldList())) { + list->changeItem(getWieldIndex(), item); + return true; + } } + return false; } - -