1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

mainly work on object scripting api

This commit is contained in:
Perttu Ahola 2011-02-23 02:49:57 +02:00
parent eef7bc3570
commit 9778347c7f
19 changed files with 962 additions and 430 deletions

View file

@ -88,35 +88,33 @@ extern "C"{
}
/*
Functions for calling from script:
object_set_base_position(self, x,y,z)
x,y,z = object_get_base_position(self)
object_add_message(self, data)
n = object_get_node(self, x,y,z)
object_remove(self)
Callbacks in script:
step(self, dtime)
get_client_init_data(self)
get_server_init_data(self)
initialize(self, data)
on_step(self, dtime)
on_get_client_init_data(self)
on_get_server_init_data(self)
on_initialize(self, data)
*/
/*
object_set_base_position(self, x, y, z)
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);
// 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);
// 3: y
lua_pushstring(L, "Y");
lua_gettable(L, -2);
lua_Number y = lua_tonumber(L, -1);
lua_pop(L, 1);
// 2: x
lua_Number x = lua_tonumber(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);
@ -130,7 +128,7 @@ static int lf_object_set_base_position(lua_State *L)
}
/*
object_get_base_position(self)
{X=,Y=,Z=} object_get_base_position(self)
*/
static int lf_object_get_base_position(lua_State *L)
{
@ -142,10 +140,21 @@ static int lf_object_get_base_position(lua_State *L)
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);
return 3; // Number of return values
lua_settable(L, -3);
return 1; // Number of return values
}
/*
@ -178,18 +187,24 @@ static int lf_object_add_message(lua_State *L)
}
/*
object_get_node(self, x,y,z)
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);
// 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);
// 3: y
lua_pushstring(L, "Y");
lua_gettable(L, -2);
lua_Number y = lua_tonumber(L, -1);
lua_pop(L, 1);
// 2: x
lua_Number x = lua_tonumber(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);
@ -217,9 +232,6 @@ static int lf_object_get_node(lua_State *L)
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;
@ -227,39 +239,82 @@ static int lf_object_get_node(lua_State *L)
#if 0
/*
object_set_node(self, x,y,z, n)
get_node_features(node)
node = {content=,param1=,param2=}
*/
static int lf_object_set_node(lua_State *L)
static int lf_get_node_features(lua_State *L)
{
MapNode n;
// 5: n
// Get fields of table
lua_pushinteger(L, "content");
// 1: node
assert(lua_istable(L, -1));
lua_pushstring(L, "content");
lua_gettable(L, -2);
n.d = lua_tonumber(L, -1);
n.d = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pushinteger(L, "param1");
lua_pushstring(L, "param1");
lua_gettable(L, -2);
n.param = lua_tonumber(L, -1);
n.param = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pushinteger(L, "param2");
lua_pushstring(L, "param2");
lua_gettable(L, -2);
n.param2 = lua_tonumber(L, -1);
n.param2 = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_pop(L, 1);
ContentFeatures &f = content_features(n.d);
}
#endif
/*
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);
// 4: z
lua_Number z = lua_tonumber(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 object_dig_node(self, {X=,Y=,Z=})
Return true on success
*/
static int lf_object_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);
// 3: y
lua_pushstring(L, "Y");
lua_gettable(L, -2);
lua_Number y = lua_tonumber(L, -1);
lua_pop(L, 1);
// 2: x
lua_Number x = lua_tonumber(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);
@ -268,27 +323,80 @@ static int lf_object_set_node(lua_State *L)
assert(self);
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 = self->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);
/*
Do stuff.
This gets sent to the server by the map through the edit
event system.
*/
bool succeeded = self->getEnv()->getMap().removeNodeWithEvent(pos);
// Return the table
lua_pushboolean(L, succeeded);
return 1;
}
/*
bool object_place_node(self, {X=,Y=,Z=}, node)
node={content=,param1=,param2=}
param1 and param2 are optional
Return true on success
*/
static int lf_object_place_node(lua_State *L)
{
// 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: self
LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1);
lua_pop(L, 1);
assert(self);
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 = self->getEnv()->getMap().addNodeWithEvent(pos, n);
lua_pushboolean(L, succeeded);
return 1;
}
#endif
/*
object_remove(x,y,z)
@ -306,6 +414,38 @@ static int lf_object_remove(lua_State *L)
return 0;
}
/*
{X=,Y=,Z=} object_get_nearest_player_position(self)
*/
/*static int lf_object_get_nearest_player_position(lua_State *L)
{
// 1: self
LuaSAO *self = (LuaSAO*)lua_touserdata(L, -1);
lua_pop(L, 1);
assert(self);
ServerEnvironment *env = self->getEnv();
env->
v3f 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);
return 1; // Number of return values
}*/
LuaSAO::LuaSAO(ServerEnvironment *env, u16 id, v3f pos):
ServerActiveObject(env, id, pos),
L(NULL)
@ -329,6 +469,9 @@ LuaSAO::LuaSAO(ServerEnvironment *env, u16 id, v3f pos):
lua_register(L, "object_get_base_position", lf_object_get_base_position);
lua_register(L, "object_add_message", lf_object_add_message);
lua_register(L, "object_get_node", lf_object_get_node);
lua_register(L, "get_content_features", lf_get_content_features);
lua_register(L, "object_dig_node", lf_object_dig_node);
lua_register(L, "object_place_node", lf_object_place_node);
lua_register(L, "object_remove", lf_object_remove);
}
@ -372,7 +515,7 @@ std::string LuaSAO::getClientInitializationData()
do{
const char *funcname = "get_client_init_data";
const char *funcname = "on_get_client_init_data";
lua_getglobal(L, funcname);
if(!lua_isfunction(L,-1))
{
@ -430,7 +573,7 @@ std::string LuaSAO::getServerInitializationData()
do{
const char *funcname = "get_server_init_data";
const char *funcname = "on_get_server_init_data";
lua_getglobal(L, funcname);
if(!lua_isfunction(L,-1))
{
@ -474,7 +617,41 @@ std::string LuaSAO::getServerInitializationData()
return data;
}
void LuaSAO::initialize(const std::string &data)
void LuaSAO::initializeFromNothing(const std::string &script_name)
{
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: "
<<funcname<<std::endl;
return;
}
// Parameters:
// 1: self
lua_pushlightuserdata(L, this);
// 2: data (other)
lua_pushstring(L, "");
// Call (2 parameters, 0 result)
if(lua_pcall(L, 2, 0, 0))
{
dstream<<"WARNING: LuaSAO: Error running function "
<<funcname<<": "
<<lua_tostring(L,-1)<<std::endl;
return;
}
}
void LuaSAO::initializeFromSave(const std::string &data)
{
std::istringstream is(data, std::ios::binary);
std::string script_name = deSerializeString(is);
@ -483,10 +660,10 @@ void LuaSAO::initialize(const std::string &data)
loadScripts(script_name);
/*
Call initialize(self, data) in the script
Call on_initialize(self, data) in the script
*/
const char *funcname = "initialize";
const char *funcname = "on_initialize";
lua_getglobal(L, funcname);
if(!lua_isfunction(L,-1))
{
@ -548,11 +725,13 @@ void LuaSAO::loadScripts(const std::string &script_name)
void LuaSAO::step(float dtime, Queue<ActiveObjectMessage> &messages)
{
lua_getglobal(L, "step");
const char *funcname = "on_step";
lua_getglobal(L, funcname);
if(!lua_isfunction(L,-1))
{
lua_pop(L,1);
dstream<<"WARNING: LuaSAO::step(): step function not found"<<std::endl;
dstream<<"WARNING: LuaSAO::step(): Function not found: "
<<funcname<<std::endl;
return;
}
@ -565,7 +744,8 @@ void LuaSAO::step(float dtime, Queue<ActiveObjectMessage> &messages)
// Call (2 parameters, 0 result)
if(lua_pcall(L, 2, 0, 0))
{
dstream<<"WARNING: LuaSAO::step(): Error running function step(): "
dstream<<"WARNING: LuaSAO::step(): Error running function "
<<funcname<<": "
<<lua_tostring(L,-1)<<std::endl;
return;
}