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

Add callback parameter for core.emerge_area()

This commit is contained in:
kwolekr 2015-10-30 02:48:37 -04:00
parent 5c3546e459
commit c2b5da735e
9 changed files with 166 additions and 22 deletions

View file

@ -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);
}
}

View file

@ -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);
};