From c2b5da735ea0c961d4f6521df9d96142c7143eee Mon Sep 17 00:00:00 2001 From: kwolekr Date: Fri, 30 Oct 2015 02:48:37 -0400 Subject: Add callback parameter for core.emerge_area() --- src/script/cpp_api/s_env.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/script/cpp_api/s_env.h | 21 ++++++++++++--------- 2 files changed, 51 insertions(+), 9 deletions(-) (limited to 'src/script/cpp_api') diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index b8717597a..a1b11bfe1 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -157,3 +157,42 @@ void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env) } lua_pop(L, 1); } + +void ScriptApiEnv::on_emerge_area_completion( + v3s16 blockpos, int action, ScriptCallbackState *state) +{ + Server *server = getServer(); + + // Note that the order of these locks is important! Envlock must *ALWAYS* + // be acquired before attempting to acquire scriptlock, or else ServerThread + // will try to acquire scriptlock after it already owns envlock, thus + // deadlocking EmergeThread and ServerThread + MutexAutoLock envlock(server->m_env_mutex); + + SCRIPTAPI_PRECHECKHEADER + + int error_handler = PUSH_ERROR_HANDLER(L); + + lua_rawgeti(L, LUA_REGISTRYINDEX, state->callback_ref); + luaL_checktype(L, -1, LUA_TFUNCTION); + + push_v3s16(L, blockpos); + lua_pushinteger(L, action); + lua_pushinteger(L, state->refcount); + lua_rawgeti(L, LUA_REGISTRYINDEX, state->args_ref); + + setOriginDirect(state->origin.c_str()); + + try { + PCALL_RES(lua_pcall(L, 4, 0, error_handler)); + } catch (LuaError &e) { + server->setAsyncFatalError(e.what()); + } + + lua_pop(L, 1); // Pop error handler + + if (state->refcount == 0) { + luaL_unref(L, LUA_REGISTRYINDEX, state->callback_ref); + luaL_unref(L, LUA_REGISTRYINDEX, state->args_ref); + } +} diff --git a/src/script/cpp_api/s_env.h b/src/script/cpp_api/s_env.h index 180cfabd0..0d98e627f 100644 --- a/src/script/cpp_api/s_env.h +++ b/src/script/cpp_api/s_env.h @@ -24,19 +24,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irr_v3d.h" class ServerEnvironment; -struct MapgenParams; +struct ScriptCallbackState; -class ScriptApiEnv - : virtual public ScriptApiBase -{ +class ScriptApiEnv : virtual public ScriptApiBase { public: - // On environment step + // Called on environment step void environment_Step(float dtime); - // After generating a piece of map - void environment_OnGenerated(v3s16 minp, v3s16 maxp,u32 blockseed); - //called on player event - void player_event(ServerActiveObject* player, std::string type); + // Called after generating a piece of map + void environment_OnGenerated(v3s16 minp, v3s16 maxp, u32 blockseed); + + // Called on player event + void player_event(ServerActiveObject *player, std::string type); + + // Called after emerge of a block queued from core.emerge_area() + void on_emerge_area_completion(v3s16 blockpos, int action, + ScriptCallbackState *state); void initializeEnvironment(ServerEnvironment *env); }; -- cgit v1.2.3