diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 7fb2eca8..bbf3e7e6 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -674,6 +674,9 @@ function __vc_create_random_methods(random_methods) local buffer = nil local buffer_size = 64 + local seed_func = random_methods.seed + local random_func = random_methods.random + function random_methods:bytes(n) local bytes = Bytearray(n) for i=1,n do @@ -682,9 +685,14 @@ function __vc_create_random_methods(random_methods) return bytes end + function random_methods:seed(x) + seed_func(self, x) + buffer = nil + end + function random_methods:random(a, b) if not buffer or index > #buffer then - buffer = self:generate(buffer_size) + buffer = random_func(self, buffer_size) index = 1 end local value = buffer[index] diff --git a/src/logic/scripting/lua/libs/librandom.cpp b/src/logic/scripting/lua/libs/librandom.cpp index b86bda58..192f83d1 100644 --- a/src/logic/scripting/lua/libs/librandom.cpp +++ b/src/logic/scripting/lua/libs/librandom.cpp @@ -22,7 +22,7 @@ static int l_random(lua::State* L) { } } -static int l_generate(lua::State* L) { +static int l_bytes(lua::State* L) { size_t size = lua::tointeger(L, 1); auto randomEngine = util::seeded_random_engine(random_device); @@ -40,7 +40,7 @@ static int l_uuid(lua::State* L) { const luaL_Reg randomlib[] = { {"random", lua::wrap}, - {"bytes", lua::wrap}, + {"bytes", lua::wrap}, {"uuid", lua::wrap}, {NULL, NULL} }; diff --git a/src/logic/scripting/lua/usertypes/lua_type_random.cpp b/src/logic/scripting/lua/usertypes/lua_type_random.cpp index 4d6a876c..99177056 100644 --- a/src/logic/scripting/lua/usertypes/lua_type_random.cpp +++ b/src/logic/scripting/lua/usertypes/lua_type_random.cpp @@ -6,7 +6,7 @@ using namespace lua; using namespace std::chrono; -static int l_generate(lua::State* L) { +static int l_random(lua::State* L) { std::uniform_int_distribution<> dist(0, std::numeric_limits::max()); auto& rng = require_userdata(L, 1).rng; @@ -20,6 +20,11 @@ static int l_generate(lua::State* L) { return 1; } +static int l_seed(lua::State* L) { + require_userdata(L, 1).rng = std::mt19937(lua::touinteger(L, 2)); + return 0; +} + static int l_meta_meta_call(lua::State* L) { integer_t seed; if (lua::isnoneornil(L, 1)) { @@ -35,8 +40,10 @@ int LuaRandom::createMetatable(lua::State* L) { requireglobal(L, "__vc_create_random_methods"); createtable(L, 0, 0); - pushcfunction(L, wrap); - setfield(L, "generate"); + pushcfunction(L, wrap); + setfield(L, "random"); + pushcfunction(L, wrap); + setfield(L, "seed"); call(L, 1, 1); setfield(L, "__index");