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

Scripting WIP: dynamic object stuff

This commit is contained in:
Perttu Ahola 2011-11-12 17:37:14 +02:00
parent 0b97ad8384
commit 1320d07068
11 changed files with 274 additions and 95 deletions

View file

@ -368,6 +368,14 @@ private:
// Exported functions
// garbage collector
static int gc_object(lua_State *L) {
ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1));
//infostream<<"ObjectRef::gc_object: o="<<o<<std::endl;
delete o;
return 0;
}
// remove(self)
static int l_remove(lua_State *L)
{
@ -427,12 +435,25 @@ private:
return 0;
}
static int gc_object(lua_State *L) {
//ObjectRef *o = checkobject(L, 1);
ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1));
//infostream<<"ObjectRef::gc_object: o="<<o<<std::endl;
delete o;
return 0;
// add_to_inventory(self, itemstring)
// returns: true if item was added, false otherwise
static int l_add_to_inventory(lua_State *L)
{
ObjectRef *ref = checkobject(L, 1);
luaL_checkstring(L, 2);
ServerActiveObject *co = getobject(ref);
if(co == NULL) return 0;
// itemstring
const char *itemstring = lua_tostring(L, 2);
infostream<<"ObjectRef::l_add_to_inventory(): id="<<co->getId()
<<" itemstring=\""<<itemstring<<"\""<<std::endl;
// Do it
std::istringstream is(itemstring, std::ios::binary);
InventoryItem *item = InventoryItem::deSerialize(is);
bool fits = co->addToInventory(item);
// Return
lua_pushboolean(L, fits);
return 1;
}
public:
@ -502,9 +523,20 @@ const luaL_reg ObjectRef::methods[] = {
method(ObjectRef, getpos),
method(ObjectRef, setpos),
method(ObjectRef, moveto),
method(ObjectRef, add_to_inventory),
{0,0}
};
// Creates a new anonymous reference if id=0
static void objectref_get_or_create(lua_State *L, ServerActiveObject *cobj)
{
if(cobj->getId() == 0){
ObjectRef::create(L, cobj);
} else {
objectref_get(L, cobj->getId());
}
}
/*
Main export function
*/
@ -570,6 +602,7 @@ void scriptapi_add_environment(lua_State *L, ServerEnvironment *env)
lua_setfield(L, -2, "env");
}
#if 0
// Dump stack top with the dump2 function
static void dump2(lua_State *L, const char *name)
{
@ -581,6 +614,7 @@ static void dump2(lua_State *L, const char *name)
if(lua_pcall(L, 2, 0, 0))
script_error(L, "error: %s\n", lua_tostring(L, -1));
}
#endif
/*
object_reference
@ -815,8 +849,9 @@ void scriptapi_luaentity_step(lua_State *L, u16 id, float dtime)
script_error(L, "error running function 'step': %s\n", lua_tostring(L, -1));
}
void scriptapi_luaentity_rightclick_player(lua_State *L, u16 id,
const char *playername)
// Calls entity:on_punch(ObjectRef puncher)
void scriptapi_luaentity_punch(lua_State *L, u16 id,
ServerActiveObject *puncher)
{
realitycheck(L);
assert(lua_checkstack(L, 20));
@ -827,12 +862,36 @@ void scriptapi_luaentity_rightclick_player(lua_State *L, u16 id,
luaentity_get(L, id);
int object = lua_gettop(L);
// State: object is at top of stack
// Get step function
// Get function
lua_getfield(L, -1, "on_punch");
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushvalue(L, object); // self
objectref_get_or_create(L, puncher); // Clicker reference
// Call with 2 arguments, 0 results
if(lua_pcall(L, 2, 0, 0))
script_error(L, "error running function 'on_punch': %s\n", lua_tostring(L, -1));
}
// Calls entity:on_rightclick(ObjectRef clicker)
void scriptapi_luaentity_rightclick(lua_State *L, u16 id,
ServerActiveObject *clicker)
{
realitycheck(L);
assert(lua_checkstack(L, 20));
//infostream<<"scriptapi_luaentity_step: id="<<id<<std::endl;
StackUnroller stack_unroller(L);
// Get minetest.luaentities[id]
luaentity_get(L, id);
int object = lua_gettop(L);
// State: object is at top of stack
// Get function
lua_getfield(L, -1, "on_rightclick");
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushvalue(L, object); // self
// Call with 1 arguments, 0 results
if(lua_pcall(L, 1, 0, 0))
script_error(L, "error running function 'step': %s\n", lua_tostring(L, -1));
objectref_get_or_create(L, clicker); // Clicker reference
// Call with 2 arguments, 0 results
if(lua_pcall(L, 2, 0, 0))
script_error(L, "error running function 'on_rightclick': %s\n", lua_tostring(L, -1));
}