diff --git a/dev/tests/example.lua b/dev/tests/example.lua index 3dbe1197..7eccf874 100644 --- a/dev/tests/example.lua +++ b/dev/tests/example.lua @@ -8,8 +8,11 @@ assert(player.get_name(pid) == "Xerxes") test.sleep_until(function() return world.count_chunks() >= 9 end, 1000) print(world.count_chunks()) -timeit(10000000, block.get, 0, 0, 0) -timeit(10000000, core.blank, 0, 0, 0) +for i=1,10 do + print("--------------------") + timeit(10000000, block.get_fast, 0, 0, 0) + timeit(10000000, block.get, 0, 0, 0) +end block.destruct(0, 0, 0, pid) assert(block.get(0, 0, 0) == 0) diff --git a/src/logic/scripting/lua/libs/libblock.cpp b/src/logic/scripting/lua/libs/libblock.cpp index c0bf1ef6..fb2a5560 100644 --- a/src/logic/scripting/lua/libs/libblock.cpp +++ b/src/logic/scripting/lua/libs/libblock.cpp @@ -120,6 +120,15 @@ static int l_get(lua::State* L) { return lua::pushinteger(L, id); } +static int l_get_fast(lua::State* L) { + auto x = lua::tointeger(L, 1); + auto y = lua::tointeger(L, 2); + auto z = lua::tointeger(L, 3); + auto vox = blocks_agent::get(*level->chunks, x, y, z); + int id = vox == nullptr ? -1 : vox->id; + return lua::pushinteger(L, id); +} + static int l_get_x(lua::State* L) { auto x = lua::tointeger(L, 1); auto y = lua::tointeger(L, 2); @@ -629,6 +638,7 @@ const luaL_Reg blocklib[] = { {"is_solid_at", lua::wrap}, {"is_replaceable_at", lua::wrap}, {"set", lua::wrap}, + {"get_fast", lua::wrap}, {"get", lua::wrap}, {"get_X", lua::wrap}, {"get_Y", lua::wrap},