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

Dynamic_Add_Media v2 (#11550)

This commit is contained in:
sfan5 2021-09-09 16:51:35 +02:00 committed by GitHub
parent bcb6565483
commit bbfae0cc67
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 796 additions and 246 deletions

View file

@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_server.h"
#include "cpp_api/s_internal.h"
#include "common/c_converter.h"
#include "util/numeric.h" // myrand
bool ScriptApiServer::getAuth(const std::string &playername,
std::string *dst_password,
@ -196,3 +197,68 @@ std::string ScriptApiServer::formatChatMessage(const std::string &name,
return ret;
}
u32 ScriptApiServer::allocateDynamicMediaCallback(int f_idx)
{
lua_State *L = getStack();
if (f_idx < 0)
f_idx = lua_gettop(L) + f_idx + 1;
lua_getglobal(L, "core");
lua_getfield(L, -1, "dynamic_media_callbacks");
luaL_checktype(L, -1, LUA_TTABLE);
// Find a randomly generated token that doesn't exist yet
int tries = 100;
u32 token;
while (1) {
token = myrand();
lua_rawgeti(L, -2, token);
bool is_free = lua_isnil(L, -1);
lua_pop(L, 1);
if (is_free)
break;
if (--tries < 0)
FATAL_ERROR("Ran out of callbacks IDs?!");
}
// core.dynamic_media_callbacks[token] = callback_func
lua_pushvalue(L, f_idx);
lua_rawseti(L, -2, token);
lua_pop(L, 2);
verbosestream << "allocateDynamicMediaCallback() = " << token << std::endl;
return token;
}
void ScriptApiServer::freeDynamicMediaCallback(u32 token)
{
lua_State *L = getStack();
verbosestream << "freeDynamicMediaCallback(" << token << ")" << std::endl;
// core.dynamic_media_callbacks[token] = nil
lua_getglobal(L, "core");
lua_getfield(L, -1, "dynamic_media_callbacks");
luaL_checktype(L, -1, LUA_TTABLE);
lua_pushnil(L);
lua_rawseti(L, -2, token);
lua_pop(L, 2);
}
void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername)
{
SCRIPTAPI_PRECHECKHEADER
int error_handler = PUSH_ERROR_HANDLER(L);
lua_getglobal(L, "core");
lua_getfield(L, -1, "dynamic_media_callbacks");
luaL_checktype(L, -1, LUA_TTABLE);
lua_rawgeti(L, -1, token);
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushstring(L, playername);
PCALL_RES(lua_pcall(L, 1, 0, error_handler));
}

View file

@ -49,6 +49,12 @@ public:
const std::string &password);
bool setPassword(const std::string &playername,
const std::string &password);
/* dynamic media handling */
u32 allocateDynamicMediaCallback(int f_idx);
void freeDynamicMediaCallback(u32 token);
void on_dynamic_media_added(u32 token, const char *playername);
private:
void getAuthHandler();
void readPrivileges(int index, std::set<std::string> &result);