aboutsummaryrefslogtreecommitdiff
path: root/src/scriptapi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/scriptapi.cpp')
-rw-r--r--src/scriptapi.cpp109
1 files changed, 83 insertions, 26 deletions
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index a50516edf..b0a99041e 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -34,6 +34,7 @@ extern "C" {
#include "script.h"
//#include "luna.h"
#include "luaentity_common.h"
+#include "content_sao.h" // For LuaEntitySAO
/*
TODO:
@@ -110,6 +111,29 @@ public:
}
};
+v3f readFloatPos(lua_State *L, int index)
+{
+ v3f pos;
+ lua_pushvalue(L, index); // Push pos
+ luaL_checktype(L, -1, LUA_TTABLE);
+ lua_getfield(L, -1, "x");
+ pos.X = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_getfield(L, -1, "y");
+ pos.Y = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_getfield(L, -1, "z");
+ pos.Z = lua_tonumber(L, -1);
+ lua_pop(L, 1);
+ lua_pop(L, 1); // Pop pos
+ pos *= BS; // Scale to internal format
+ return pos;
+}
+
+/*
+ Global functions
+*/
+
// Register new object prototype
// register_entity(name, prototype)
static int l_register_entity(lua_State *L)
@@ -149,16 +173,18 @@ static const struct luaL_Reg minetest_f [] = {
{NULL, NULL}
};
-static int l_entity_set_deleted(lua_State *L)
-{
- return 0;
-}
+/*
+ LuaEntity functions
+*/
static const struct luaL_Reg minetest_entity_m [] = {
- {"set_deleted", l_entity_set_deleted},
{NULL, NULL}
};
+/*
+ Getters for stuff in main tables
+*/
+
static void objectref_get(lua_State *L, u16 id)
{
// Get minetest.object_refs[i]
@@ -324,12 +350,28 @@ private:
return *(ObjectRef**)ud; // unbox pointer
}
+ static ServerActiveObject* getobject(ObjectRef *ref)
+ {
+ ServerActiveObject *co = ref->m_object;
+ return co;
+ }
+
+ static LuaEntitySAO* getluaobject(ObjectRef *ref)
+ {
+ ServerActiveObject *obj = getobject(ref);
+ if(obj == NULL)
+ return NULL;
+ if(obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY)
+ return NULL;
+ return (LuaEntitySAO*)obj;
+ }
+
// Exported functions
static int l_remove(lua_State *L)
{
- ObjectRef *o = checkobject(L, 1);
- ServerActiveObject *co = o->m_object;
+ ObjectRef *ref = checkobject(L, 1);
+ ServerActiveObject *co = getobject(ref);
if(co == NULL) return 0;
infostream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
co->m_removed = true;
@@ -338,8 +380,8 @@ private:
static int l_getpos(lua_State *L)
{
- ObjectRef *o = checkobject(L, 1);
- ServerActiveObject *co = o->m_object;
+ ObjectRef *ref = checkobject(L, 1);
+ ServerActiveObject *co = getobject(ref);
if(co == NULL) return 0;
infostream<<"ObjectRef::l_getpos(): id="<<co->getId()<<std::endl;
v3f pos = co->getBasePosition() / BS;
@@ -353,6 +395,32 @@ private:
return 1;
}
+ static int l_setpos(lua_State *L)
+ {
+ ObjectRef *ref = checkobject(L, 1);
+ //LuaEntitySAO *co = getluaobject(ref);
+ ServerActiveObject *co = getobject(ref);
+ if(co == NULL) return 0;
+ // pos
+ v3f pos = readFloatPos(L, 2);
+ // Do it
+ co->setPos(pos);
+ return 0;
+ }
+
+ static int l_moveto(lua_State *L)
+ {
+ ObjectRef *ref = checkobject(L, 1);
+ //LuaEntitySAO *co = getluaobject(ref);
+ ServerActiveObject *co = getobject(ref);
+ if(co == NULL) return 0;
+ // pos
+ v3f pos = readFloatPos(L, 2);
+ // Do it
+ co->moveTo(pos);
+ return 0;
+ }
+
static int gc_object(lua_State *L) {
//ObjectRef *o = checkobject(L, 1);
ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1));
@@ -426,6 +494,8 @@ const char ObjectRef::className[] = "ObjectRef";
const luaL_reg ObjectRef::methods[] = {
method(ObjectRef, remove),
method(ObjectRef, getpos),
+ method(ObjectRef, setpos),
+ method(ObjectRef, moveto),
{0,0}
};
@@ -438,6 +508,7 @@ void scriptapi_export(lua_State *L, Server *server)
realitycheck(L);
assert(lua_checkstack(L, 20));
infostream<<"scriptapi_export"<<std::endl;
+ StackUnroller stack_unroller(L);
// Register global functions in table minetest
lua_newtable(L);
@@ -459,14 +530,6 @@ void scriptapi_export(lua_State *L, Server *server)
lua_newtable(L);
lua_setfield(L, -2, "luaentities");
- // Load and run some base Lua stuff
- /*script_load(L, (porting::path_data + DIR_DELIM + "scripts"
- + DIR_DELIM + "base.lua").c_str());*/
-
- // Create entity reference metatable
- //luaL_newmetatable(L, "minetest.entity_reference");
- //lua_pop(L, 1);
-
// Create entity prototype
luaL_newmetatable(L, "minetest.entity");
// metatable.__index = metatable
@@ -488,6 +551,7 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
realitycheck(L);
assert(lua_checkstack(L, 20));
infostream<<"scriptapi_add_environment"<<std::endl;
+ StackUnroller stack_unroller(L);
// Create EnvRef on stack
EnvRef::create(L, env);
@@ -498,9 +562,6 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
luaL_checktype(L, -1, LUA_TTABLE);
lua_pushvalue(L, envref);
lua_setfield(L, -2, "env");
-
- // pop minetest and envref
- lua_pop(L, 2);
}
// Dump stack top with the dump2 function
@@ -524,6 +585,7 @@ void scriptapi_add_object_reference(lua_State *L, ServerActiveObject *cobj)
realitycheck(L);
assert(lua_checkstack(L, 20));
infostream<<"scriptapi_add_object_reference: id="<<cobj->getId()<<std::endl;
+ StackUnroller stack_unroller(L);
// Create object on stack
ObjectRef::create(L, cobj); // Puts ObjectRef (as userdata) on stack
@@ -539,9 +601,6 @@ void scriptapi_add_object_reference(lua_State *L, ServerActiveObject *cobj)
lua_pushnumber(L, cobj->getId()); // Push id
lua_pushvalue(L, object); // Copy object to top of stack
lua_settable(L, objectstable);
-
- // pop object_refs, minetest and the object
- lua_pop(L, 3);
}
void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj)
@@ -549,6 +608,7 @@ void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj)
realitycheck(L);
assert(lua_checkstack(L, 20));
infostream<<"scriptapi_rm_object_reference: id="<<cobj->getId()<<std::endl;
+ StackUnroller stack_unroller(L);
// Get minetest.object_refs table
lua_getglobal(L, "minetest");
@@ -567,9 +627,6 @@ void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj)
lua_pushnumber(L, cobj->getId()); // Push id
lua_pushnil(L);
lua_settable(L, objectstable);
-
- // pop object_refs, minetest
- lua_pop(L, 2);
}
/*