X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Fserverobject.cpp;h=699040bf2599a42716aa4dd0ec471c39183042e8;hb=d58211264e98d80dc80fc5b15171670a2b82abb5;hp=e62f1efd0386708f20041fd23c3414d6ad14124c;hpb=be32adc872a085f6ced03000362b352b121fa103;p=minetest.git diff --git a/src/serverobject.cpp b/src/serverobject.cpp index e62f1efd0..699040bf2 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,772 +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="<m_removed = true; - - return 0; -} - -/* - ServerEnvironment object_get_environment(self) -*/ -static int lf_object_get_environment(lua_State *L) -{ - // 1: self - LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1); - lua_pop(L, 1); - - assert(self); - - lua_pushlightuserdata(L, self->getEnv()); - return 1; -} - -/* - object_set_base_position(self, {X=,Y=,Z=}) -*/ -static int lf_object_set_base_position(lua_State *L) -{ - // 2: position - assert(lua_istable(L, -1)); - lua_pushstring(L, "X"); - lua_gettable(L, -2); - lua_Number x = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Y"); - lua_gettable(L, -2); - lua_Number y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Z"); - lua_gettable(L, -2); - lua_Number z = lua_tonumber(L, -1); - lua_pop(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 -} - -/* - {X=,Y=,Z=} 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_newtable(L); - - lua_pushstring(L, "X"); - lua_pushnumber(L, pos.X/BS); - lua_settable(L, -3); - - lua_pushstring(L, "Y"); - lua_pushnumber(L, pos.Y/BS); - lua_settable(L, -3); - - lua_pushstring(L, "Z"); - lua_pushnumber(L, pos.Z/BS); - lua_settable(L, -3); - - return 1; // 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 -} - -/* - env_get_node(env, {X=,Y=,Z=}) -*/ -static int lf_env_get_node(lua_State *L) -{ - // 2: position - assert(lua_istable(L, -1)); - lua_pushstring(L, "X"); - lua_gettable(L, -2); - lua_Number x = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Y"); - lua_gettable(L, -2); - lua_Number y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Z"); - lua_gettable(L, -2); - lua_Number z = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pop(L, 1); - // 1: env - ServerEnvironment *env = (ServerEnvironment*)lua_touserdata(L, -1); - lua_pop(L, 1); - - assert(env); - - v3s16 pos = floatToInt(v3f(x,y,z), 1.0); - - /*dstream<<"Checking node from pos=("<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); - - // Return the table - return 1; -} - -/* - get_content_features(content) -*/ -static int lf_get_content_features(lua_State *L) -{ - MapNode n; - - // 1: content - n.d = lua_tointeger(L, -1); - lua_pop(L, 1); - - // Get and return information - ContentFeatures &f = content_features(n.d); - - lua_newtable(L); - lua_pushstring(L, "walkable"); - lua_pushboolean(L, f.walkable); - lua_settable(L, -3); - lua_pushstring(L, "diggable"); - lua_pushboolean(L, f.diggable); - lua_settable(L, -3); - lua_pushstring(L, "buildable_to"); - lua_pushboolean(L, f.buildable_to); - lua_settable(L, -3); - - return 1; -} - -/* - bool env_dig_node(env, {X=,Y=,Z=}) - Return true on success -*/ -static int lf_env_dig_node(lua_State *L) -{ - // 2: position - assert(lua_istable(L, -1)); - lua_pushstring(L, "X"); - lua_gettable(L, -2); - lua_Number x = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Y"); - lua_gettable(L, -2); - lua_Number y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Z"); - lua_gettable(L, -2); - lua_Number z = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pop(L, 1); - // 1: env - ServerEnvironment *env = (ServerEnvironment*)lua_touserdata(L, -1); - lua_pop(L, 1); - assert(env); - - v3s16 pos = floatToInt(v3f(x,y,z), 1.0); - - /* - Do stuff. - This gets sent to the server by the map through the edit - event system. - */ - bool succeeded = env->getMap().removeNodeWithEvent(pos); - - lua_pushboolean(L, succeeded); - return 1; -} - -/* - bool env_place_node(env, {X=,Y=,Z=}, node) - node={content=,param1=,param2=} - param1 and param2 are optional - Return true on success -*/ -static int lf_env_place_node(lua_State *L) +ServerActiveObject* ServerActiveObject::create(ActiveObjectType type, + ServerEnvironment *env, u16 id, v3f pos, + const std::string &data) { - // 3: node - MapNode n(CONTENT_STONE); - assert(lua_istable(L, -1)); - { - lua_pushstring(L, "content"); - lua_gettable(L, -2); - if(lua_isnumber(L, -1)) - n.d = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "param1"); - lua_gettable(L, -2); - if(lua_isnumber(L, -1)) - n.param = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "param2"); - lua_gettable(L, -2); - if(lua_isnumber(L, -1)) - n.param2 = lua_tonumber(L, -1); - lua_pop(L, 1); - } - lua_pop(L, 1); - // 2: position - assert(lua_istable(L, -1)); - lua_pushstring(L, "X"); - lua_gettable(L, -2); - lua_Number x = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Y"); - lua_gettable(L, -2); - lua_Number y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Z"); - lua_gettable(L, -2); - lua_Number z = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pop(L, 1); - // 1: env - ServerEnvironment *env = (ServerEnvironment*)lua_touserdata(L, -1); - lua_pop(L, 1); - assert(env); - - v3s16 pos = floatToInt(v3f(x,y,z), 1.0); - - /* - Do stuff. - This gets sent to the server by the map through the edit - event system. - */ - bool succeeded = env->getMap().addNodeWithEvent(pos, n); - - lua_pushboolean(L, succeeded); - return 1; -} - -/* - string env_get_nearest_player_name(env, {X=,Y=,Z=}) -*/ -static int lf_env_get_nearest_player_name(lua_State *L) -{ - // 2: position - assert(lua_istable(L, -1)); - lua_pushstring(L, "X"); - lua_gettable(L, -2); - lua_Number x = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Y"); - lua_gettable(L, -2); - lua_Number y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pushstring(L, "Z"); - lua_gettable(L, -2); - lua_Number z = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_pop(L, 1); - // 1: env - ServerEnvironment *env = (ServerEnvironment*)lua_touserdata(L, -1); - lua_pop(L, 1); - assert(env); - - v3f pos_f = v3f(x,y,z)*BS; - - Player *player = env->getNearestConnectedPlayer(pos_f); - - if(player) - lua_pushstring(L, player->getName()); - else - lua_pushstring(L, ""); - - return 1; // Number of return values -} - -/* - {exists=, pos={X=,Y=,Z=}, connected=} env_get_player_info(env, name) -*/ -static int lf_env_get_player_info(lua_State *L) -{ - // 2: name - const char *name = lua_tostring(L, -1); - lua_pop(L, 1); - // 1: env - ServerEnvironment *env = (ServerEnvironment*)lua_touserdata(L, -1); - lua_pop(L, 1); - assert(env); - - Player *player = env->getPlayer(name); - v3f pos(0,0,0); - if(player) - pos = player->getPosition(); - - lua_newtable(L); - - lua_pushstring(L, "exists"); - lua_pushboolean(L, (player != NULL)); - lua_settable(L, -3); - - if(player != NULL) - { - lua_pushstring(L, "pos"); - { - lua_newtable(L); - - lua_pushstring(L, "X"); - lua_pushnumber(L, pos.X/BS); - lua_settable(L, -3); - - lua_pushstring(L, "Y"); - lua_pushnumber(L, pos.Y/BS); - lua_settable(L, -3); - - lua_pushstring(L, "Z"); - lua_pushnumber(L, pos.Z/BS); - lua_settable(L, -3); + // Find factory function + std::map::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; } - lua_settable(L, -3); - lua_pushstring(L, "connected"); - lua_pushboolean(L, (player->peer_id != 0)); - lua_settable(L, -3); + // If factory is not found, just return. + dstream<<"WARNING: ServerActiveObject: No factory for type=" + < 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 = "on_get_client_init_data"; - lua_getglobal(L, funcname); - if(!lua_isfunction(L,-1)) - { - lua_pop(L,1); - dstream<<"WARNING: LuaSAO: Function not found: " - <second; + ServerActiveObject *object = (*f)(env, pos, data); + return object; } -void LuaSAO::initializeFromNothing(const std::string &script_name) +void ServerActiveObject::registerType(u16 type, Factory f) { - loadScripts(script_name); - - /* - Call on_initialize(self, data) in the script - */ - - const char *funcname = "on_initialize"; - 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()) return; - } + m_types[type] = f; } -void LuaSAO::initializeFromSave(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 on_initialize(self, data) in the script - */ - - const char *funcname = "on_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) { - const char *funcname = "on_step"; - lua_getglobal(L, funcname); - if(!lua_isfunction(L,-1)) - { - lua_pop(L,1); - dstream<<"WARNING: LuaSAO::step(): Function not found: " - <getList(getWieldList())) { + list->changeItem(getWieldIndex(), item); + return true; + } } + return false; } - -