aboutsummaryrefslogtreecommitdiff
path: root/src/script/cpp_api
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2015-10-30 02:48:37 -0400
committerkwolekr <kwolekr@minetest.net>2015-11-02 18:43:09 -0500
commitc2b5da735ea0c961d4f6521df9d96142c7143eee (patch)
tree667ffa9cbbf5a606979a942634b030528822762c /src/script/cpp_api
parent5c3546e459ede7fbdfc22b340ed6b2af5073ec5b (diff)
downloadminetest-c2b5da735ea0c961d4f6521df9d96142c7143eee.tar.gz
minetest-c2b5da735ea0c961d4f6521df9d96142c7143eee.tar.bz2
minetest-c2b5da735ea0c961d4f6521df9d96142c7143eee.zip
Add callback parameter for core.emerge_area()
Diffstat (limited to 'src/script/cpp_api')
-rw-r--r--src/script/cpp_api/s_env.cpp39
-rw-r--r--src/script/cpp_api/s_env.h21
2 files changed, 51 insertions, 9 deletions
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);
};