diff --git a/src/logic/scripting/lua/libs/libplayer.cpp b/src/logic/scripting/lua/libs/libplayer.cpp index 9f634bddb..a978e5c22 100644 --- a/src/logic/scripting/lua/libs/libplayer.cpp +++ b/src/logic/scripting/lua/libs/libplayer.cpp @@ -14,6 +14,13 @@ using namespace scripting; +static Level& require_level() { + if (level == nullptr) { + throw std::runtime_error("world is not loaded"); + } + return *level; +} + inline Player* get_player(lua::State* L, int idx) { if (!lua::isnumber(L, idx)) { if (engine->isHeadless()) { @@ -22,7 +29,7 @@ inline Player* get_player(lua::State* L, int idx) { ); } } - return level->players->get(lua::tointeger(L, idx)); + return require_level().players->get(lua::tointeger(L, idx)); } static int l_get_pos(lua::State* L) { @@ -304,15 +311,18 @@ static int l_create(lua::State* L) { if (lua::gettop(L) >= 2) { playerId = lua::tointeger(L, 2); } - auto player = level->players->create(playerId); + auto& level = require_level(); + auto player = level.players->create(playerId); player->setName(lua::require_string(L, 1)); return lua::pushinteger(L, player->getId()); } static int l_delete(lua::State* L) { auto id = lua::tointeger(L, 1); - level->players->suspend(id); - level->players->remove(id); + + auto& level = require_level(); + level.players->suspend(id); + level.players->remove(id); return 0; } @@ -324,19 +334,21 @@ static int l_is_suspended(lua::State* L) { } static int l_set_suspended(lua::State* L) { + auto& level = require_level(); if (lua::toboolean(L, 2)) { - level->players->suspend(lua::tointeger(L, 1)); + level.players->suspend(lua::tointeger(L, 1)); } else { - level->players->resume(lua::tointeger(L, 1)); + level.players->resume(lua::tointeger(L, 1)); } return 0; } static int l_get_all_in_radius(lua::State* L) { + auto& level = require_level(); auto center = lua::tovec3(L, 1); auto radius = static_cast(lua::tonumber(L, 2)); - auto players = level->players->getAllInRadius(center, radius); + auto players = level.players->getAllInRadius(center, radius); lua::createtable(L, players.size(), 0); for (size_t i = 0; i < players.size(); i++) { lua::pushinteger(L, players[i]->getId()); @@ -346,7 +358,7 @@ static int l_get_all_in_radius(lua::State* L) { } static int l_get_all(lua::State* L) { - auto players = level->players->getAll(); + auto players = require_level().players->getAll(); lua::createtable(L, players.size(), 0); for (size_t i = 0; i < players.size(); i++) { lua::pushinteger(L, players[i]->getId()); @@ -356,8 +368,9 @@ static int l_get_all(lua::State* L) { } static int l_get_nearest(lua::State* L) { + auto& level = require_level(); auto position = lua::tovec3(L, 1); - if (auto player = level->players->getNearest(position)) { + if (auto player = level.players->getNearest(position)) { lua::pushinteger(L, player->getId()); return 1; }