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:
parent
5c3546e459
commit
c2b5da735e
9 changed files with 166 additions and 22 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue