From 1320d07068f25ff23ea27e120983c006f75bec24 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 12 Nov 2011 17:37:14 +0200 Subject: Scripting WIP: dynamic object stuff --- src/scriptapi.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 12 deletions(-) (limited to 'src/scriptapi.cpp') diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index f8875c0e3..530c1719e 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -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="<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="<