-/*
- 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<ActiveObjectMessage> &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="<<getId()<<" sending data"<<std::endl;
-
- std::string data;
-
- data += itos(0); // 0 = position
- data += " ";
- data += itos(m_base_position.X);
- data += " ";
- data += itos(m_base_position.Y);
- data += " ";
- data += itos(m_base_position.Z);
-
- ActiveObjectMessage aom(getId(), false, data);
- messages.push_back(aom);
- }
-}
-
-/*
- LuaSAO
-*/
-
-extern "C"{
-#include "lstring.h"
-}
-
-/*
- Callbacks in script:
-
- on_step(self, dtime)
- on_get_client_init_data(self)
- on_get_server_init_data(self)
- on_initialize(self, data)
-*/
-
-/*
- 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;
-}
-
-/*
- 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="<<data<<std::endl;
-
- // Create message and add to queue
- ActiveObjectMessage aom(self->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=("<<pos.X<<","<<pos.Y<<","<<pos.Z
- <<")"<<std::endl;*/
-
- // Get the node
- MapNode n(CONTENT_IGNORE);
- n = env->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)