For consistency, implement calling of on_chat_message callbacks in C

This commit is contained in:
Perttu Ahola 2011-11-28 01:13:55 +02:00
parent 30648d1cc9
commit 19a1ac1f34
2 changed files with 21 additions and 21 deletions

@ -166,14 +166,4 @@ minetest.registered_on_generateds, minetest.register_on_generated = make_registr
minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration() minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration() minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
minetest.on_chat_message = function(name, message)
for i,func in ipairs(minetest.registered_on_chat_messages) do
local ate = func(name, message)
if ate then
return true
end
end
return false
end
-- END -- END

@ -1548,18 +1548,28 @@ bool scriptapi_on_chat_message(lua_State *L, const std::string &name,
assert(lua_checkstack(L, 20)); assert(lua_checkstack(L, 20));
StackUnroller stack_unroller(L); StackUnroller stack_unroller(L);
// Get minetest.on_chat_message builtin function // Get minetest.registered_on_chat_messages
lua_getglobal(L, "minetest"); lua_getglobal(L, "minetest");
lua_getfield(L, -1, "on_chat_message"); lua_getfield(L, -1, "registered_on_chat_messages");
luaL_checktype(L, -1, LUA_TTABLE);
int table = lua_gettop(L);
// Foreach
lua_pushnil(L);
while(lua_next(L, table) != 0){
// key at index -2 and value at index -1
luaL_checktype(L, -1, LUA_TFUNCTION); luaL_checktype(L, -1, LUA_TFUNCTION);
// Call function // Call function
lua_pushstring(L, name.c_str()); lua_pushstring(L, name.c_str());
lua_pushstring(L, message.c_str()); lua_pushstring(L, message.c_str());
if(lua_pcall(L, 2, 1, 0)) if(lua_pcall(L, 2, 1, 0))
script_error(L, "error: %s\n", lua_tostring(L, -1)); script_error(L, "error: %s\n", lua_tostring(L, -1));
bool ate = lua_toboolean(L, -1); bool ate = lua_toboolean(L, -1);
return ate; lua_pop(L, 1);
if(ate)
return true;
// value removed, keep key for next iteration
}
return false;
} }
/* /*