mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add minetest.register_lbm() to run code on block load only
This commit is contained in:
parent
88fbe7ca1e
commit
d494733839
12 changed files with 493 additions and 25 deletions
|
@ -90,6 +90,46 @@ void LuaABM::trigger(ServerEnvironment *env, v3s16 p, MapNode n,
|
|||
lua_pop(L, 1); // Pop error handler
|
||||
}
|
||||
|
||||
void LuaLBM::trigger(ServerEnvironment *env, v3s16 p, MapNode n)
|
||||
{
|
||||
GameScripting *scriptIface = env->getScriptIface();
|
||||
scriptIface->realityCheck();
|
||||
|
||||
lua_State *L = scriptIface->getStack();
|
||||
sanity_check(lua_checkstack(L, 20));
|
||||
StackUnroller stack_unroller(L);
|
||||
|
||||
int error_handler = PUSH_ERROR_HANDLER(L);
|
||||
|
||||
// Get registered_lbms
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_lbms");
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
lua_remove(L, -2); // Remove core
|
||||
|
||||
// Get registered_lbms[m_id]
|
||||
lua_pushnumber(L, m_id);
|
||||
lua_gettable(L, -2);
|
||||
FATAL_ERROR_IF(lua_isnil(L, -1), "Entry with given id not found in registered_lbms table");
|
||||
lua_remove(L, -2); // Remove registered_lbms
|
||||
|
||||
scriptIface->setOriginFromTable(-1);
|
||||
|
||||
// Call action
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
lua_getfield(L, -1, "action");
|
||||
luaL_checktype(L, -1, LUA_TFUNCTION);
|
||||
lua_remove(L, -2); // Remove registered_lbms[m_id]
|
||||
push_v3s16(L, p);
|
||||
pushnode(L, n, env->getGameDef()->ndef());
|
||||
|
||||
int result = lua_pcall(L, 2, 0, error_handler);
|
||||
if (result)
|
||||
scriptIface->scriptError(result, "LuaLBM::trigger");
|
||||
|
||||
lua_pop(L, 1); // Pop error handler
|
||||
}
|
||||
|
||||
void LuaEmergeAreaCallback(v3s16 blockpos, EmergeAction action, void *param)
|
||||
{
|
||||
ScriptCallbackState *state = (ScriptCallbackState *)param;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue