diff --git a/doc/en/scripting/builtins/libapp.md b/doc/en/scripting/builtins/libapp.md index ffc4d923..3a8712c7 100644 --- a/doc/en/scripting/builtins/libapp.md +++ b/doc/en/scripting/builtins/libapp.md @@ -77,12 +77,14 @@ Checks if content is loaded. ```lua app.new_world( - -- world name + -- world name, empty string will create a nameless world name: str, -- generation seed seed: str, -- generator name generator: str + -- local player id + [optional] local_player: int=0 ) ``` diff --git a/doc/en/scripting/builtins/libhud.md b/doc/en/scripting/builtins/libhud.md index 72b1a4ed..06766422 100644 --- a/doc/en/scripting/builtins/libhud.md +++ b/doc/en/scripting/builtins/libhud.md @@ -62,4 +62,7 @@ hud.is_paused() -> bool -- Returns true if inventory is open or overlay is shown. hud.is_inventory_open() -> bool + +-- Sets whether to allow pausing. If false, the pause menu will not pause the game. +hud.set_allow_pause(flag: bool) ``` diff --git a/doc/en/scripting/builtins/libplayer.md b/doc/en/scripting/builtins/libplayer.md index 041bf442..e235377a 100644 --- a/doc/en/scripting/builtins/libplayer.md +++ b/doc/en/scripting/builtins/libplayer.md @@ -37,10 +37,10 @@ player.set_vel(playerid: int, x: number, y: number, z: number) Sets x, y, z player linear velocity ```lua -player.get_rot(playerid: int) -> number, number, number +player.get_rot(playerid: int, interpolated: bool) -> number, number, number ``` -Returns x, y, z of camera rotation (radians) +Returns x, y, z of camera rotation (radians). Interpolation is relevant in cases where the rotation refresh rate is lower than the frame rate. ```lua player.set_rot(playerid: int, x: number, y: number, z: number) diff --git a/doc/en/scripting/ui.md b/doc/en/scripting/ui.md index 5013b448..f5bb8401 100644 --- a/doc/en/scripting/ui.md +++ b/doc/en/scripting/ui.md @@ -56,6 +56,7 @@ Common element methods: | ------------------- | ----------------------------------------------------------------------------------- | | moveInto(container) | moves the element to the specified container (the element is specified, not the id) | | destruct() | removes element | +| reposition() | updates the element position based on the `positionfunc` | ## Containers diff --git a/doc/en/text-styles.md b/doc/en/text-styles.md index e85437e1..4afce42a 100644 --- a/doc/en/text-styles.md +++ b/doc/en/text-styles.md @@ -19,3 +19,34 @@ Styles can be combined. Example: Output: ***Message*** using *~~combed~~ combined* styles~~.~~ + +# Colors + +Text color can be set using a color code: [#RRGGBB] + + +| Component | Purpose | +| --------- | --------------------------------- | +| R | Represents the intensity of red | +| G | Represents the intensity of green | +| B | Represents the intensity of blue | + +### Example: + + + + [#ff0000] + Red Text + + + + + [#00ff00] + Green Text + + + + + [#0000ff] + Blue Text + diff --git a/doc/en/xml-ui-layouts.md b/doc/en/xml-ui-layouts.md index 3f0bff07..8856338a 100644 --- a/doc/en/xml-ui-layouts.md +++ b/doc/en/xml-ui-layouts.md @@ -35,6 +35,7 @@ Examples: - `margin` - element margin. Type: 4D vector *left, top, right, bottom* - `visible` - element visibility. Type: boolean (true/false) +- `min-size` - minimal element size. Type: 2D vector. - `position-func` - position supplier for an element (two numbers), called on every parent container size update or on element adding on a container. May be called before *on_hud_open* - `size-func` - element size provider (two numbers), called when the size of the container in which the element is located changes, or when an element is added to the container. Can be called before on_hud_open is called. - `onclick` - lua function called when an element is clicked. @@ -65,6 +66,7 @@ Buttons and panels are also containers. Buttons are also panels. - `max-length` - maximal length of panel stretching before scrolling (if scrollable = true). Type: number +- `min-length` - minimal length of panel. Type: number - `orientation` - panel orientation: horizontal/vertical. # Common elements diff --git a/doc/ru/scripting/builtins/libapp.md b/doc/ru/scripting/builtins/libapp.md index c0f3b741..eb504d25 100644 --- a/doc/ru/scripting/builtins/libapp.md +++ b/doc/ru/scripting/builtins/libapp.md @@ -77,12 +77,14 @@ app.is_content_loaded() -> bool ```lua app.new_world( - -- название мира + -- название мира, пустая строка приведёт к созданию безымянного мира name: str, -- зерно генерации seed: str, -- название генератора generator: str + -- id локального игрока + [опционально] local_player: int=0 ) ``` diff --git a/doc/ru/scripting/builtins/libhud.md b/doc/ru/scripting/builtins/libhud.md index d43867ac..311542cb 100644 --- a/doc/ru/scripting/builtins/libhud.md +++ b/doc/ru/scripting/builtins/libhud.md @@ -65,4 +65,7 @@ hud.is_paused() -> bool -- Возвращает true если открыт инвентарь или оверлей. hud.is_inventory_open() -> bool + +-- Устанавливает разрешение на паузу. При значении false меню паузы не приостанавливает игру. +hud.set_allow_pause(flag: bool) ``` diff --git a/doc/ru/scripting/builtins/libplayer.md b/doc/ru/scripting/builtins/libplayer.md index a9662015..35dda747 100644 --- a/doc/ru/scripting/builtins/libplayer.md +++ b/doc/ru/scripting/builtins/libplayer.md @@ -37,10 +37,10 @@ player.set_vel(playerid: int, x: number, y: number, z: number) Устанавливает x, y, z линейной скорости игрока ```lua -player.get_rot(playerid: int) -> number, number, number +player.get_rot(playerid: int, interpolated: bool=false) -> number, number, number ``` -Возвращает x, y, z вращения камеры (в радианах) +Возвращает x, y, z вращения камеры (в радианах). Интерполяция актуальна в случаях, когда частота обновления вращения ниже частоты кадров. ```lua player.set_rot(playerid: int, x: number, y: number, z: number) diff --git a/doc/ru/scripting/ui.md b/doc/ru/scripting/ui.md index 3c203d37..7e10a180 100644 --- a/doc/ru/scripting/ui.md +++ b/doc/ru/scripting/ui.md @@ -56,6 +56,7 @@ document["worlds-panel"]:clear() | ------------------- | ----------------------------------------------------------------------- | | moveInto(container) | перемещает элемент в указанный контейнер (указывается элемент, а не id) | | destruct() | удаляет элемент | +| reposition() | обновляет позицию элемента на основе функции позиционирования | ## Контейнеры diff --git a/doc/ru/text-styles.md b/doc/ru/text-styles.md index 0a09abe3..4fbe3ed5 100644 --- a/doc/ru/text-styles.md +++ b/doc/ru/text-styles.md @@ -19,3 +19,33 @@ Вывод: ***Сообщение***, демонстрирующее *~~обедненные~~ объединенные* стили~~.~~ + +## Цвета + +Цвет текста задается при помощи цветового кода: [#RRGGBB] + +| Компонент | Назначение | +| ------------ | ------------------------- | +| R | Используется для интенсивности красного | +| G | Используется для интенсивности зеленого | +| B | Используется для интенсивности синего | + +### Например: + + + + [#ff0000] + Красный Текст + + + + + [#00ff00] + Зеленый Текст + + + + + [#0000ff] + Синий Текст + \ No newline at end of file diff --git a/doc/ru/xml-ui-layouts.md b/doc/ru/xml-ui-layouts.md index f562ee4c..00db0754 100644 --- a/doc/ru/xml-ui-layouts.md +++ b/doc/ru/xml-ui-layouts.md @@ -39,6 +39,7 @@ - `margin` - внешний отступ элемента. Тип: 4D вектор. Порядок: `"left,top,right,bottom"` - `visible` - видимость элемента. Тип: логический ("true"/"false"). +- `min-size` - минимальный размер элемента. Тип: 2D вектор. - `position-func` - поставщик позиции элемента (два числа), вызываемый при изменении размера контейнера, в котором находится элемент, либо при добавлении элемента в контейнер. Может быть вызван до вызова on_hud_open. - `size-func` - поставщик размера элемента (два числа), вызываемый при изменении размера контейнера, в котором находится элемент, либо при добавлении элемента в контейнер. Может быть вызван до вызова on_hud_open. - `onclick` - lua функция вызываемая при нажатии на элемент. @@ -67,6 +68,7 @@ В число панелей также входят кнопки. - `max-length` - максимальная длина, на которую растягивается панель до начала скроллинга (если scrollable = true). Тип: число +- `min-length` - минимальная длина панели. Тип: число - `orientation` - ориентация панели: horizontal/vertical. # Основные элементы diff --git a/res/content/base/scripts/components/player_animator.lua b/res/content/base/scripts/components/player_animator.lua index 871284d5..8862c6c2 100644 --- a/res/content/base/scripts/components/player_animator.lua +++ b/res/content/base/scripts/components/player_animator.lua @@ -3,7 +3,9 @@ local body = entity.rigidbody local rig = entity.skeleton local itemid = 0 +local headIndex = rig:index("head") local itemIndex = rig:index("item") +local bodyIndex = rig:index("body") local function refresh_model(id) itemid = id @@ -12,7 +14,16 @@ local function refresh_model(id) end function on_render() - local invid, slotid = player.get_inventory() + local pid = entity:get_player() + if pid == -1 then + return + end + + local rx, ry, rz = player.get_rot(pid, true) + rig:set_matrix(headIndex, mat4.rotate({1, 0, 0}, ry)) + rig:set_matrix(bodyIndex, mat4.rotate({0, 1, 0}, rx)) + + local invid, slotid = player.get_inventory(pid) local id, _ = inventory.get(invid, slotid) if id ~= itemid then refresh_model(id) diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua index 11d7bd14..7e41ddf6 100644 --- a/res/layouts/console.xml.lua +++ b/res/layouts/console.xml.lua @@ -134,6 +134,10 @@ function add_to_history(text) end function submit(text) + if #text == 0 then + document.prompt.focused = true + return + end text = text:trim() add_to_history(text) @@ -204,4 +208,11 @@ function on_open(mode) elseif mode then modes:set(mode) end + hud.close("core:ingame_chat") +end + +function on_close() + time.post_runnable(function() + hud.open_permanent("core:ingame_chat") + end) end diff --git a/res/layouts/ingame_chat.xml b/res/layouts/ingame_chat.xml new file mode 100644 index 00000000..45ad4749 --- /dev/null +++ b/res/layouts/ingame_chat.xml @@ -0,0 +1,8 @@ + + diff --git a/res/layouts/ingame_chat.xml.lua b/res/layouts/ingame_chat.xml.lua new file mode 100644 index 00000000..52f38ce7 --- /dev/null +++ b/res/layouts/ingame_chat.xml.lua @@ -0,0 +1,59 @@ +local lines = {} +local dead_lines = {} +local nextid = 0 +local timeout = 7 +local fadeout = 1 +local initialized = false +local max_lines = 15 +local animation_fps = 30 + +local function remove_line(line) + document[line[1]]:destruct() + time.post_runnable(function() document.root:reposition() end) +end + +local function update_line(line, uptime) + local diff = uptime - line[2] + if diff > timeout then + remove_line(line) + table.insert(dead_lines, i) + elseif diff > timeout-fadeout then + local opacity = (timeout - diff) / fadeout + document[line[1]].color = {0, 0, 0, opacity * 80} + document[line[1].."L"].color = {255, 255, 255, opacity * 255} + end +end + +events.on("core:chat", function(message) + local current_time = time.uptime() + local id = 'l'..tostring(nextid) + document.root:add(gui.template("chat_line", {id=id})) + document.root:reposition() + document[id.."L"].text = message + nextid = nextid + 1 + if #lines == max_lines then + remove_line(lines[1]) + table.remove(lines, 1) + end + table.insert(lines, {id, current_time}) +end) + +function on_open() + if not initialized then + initialized = true + + document.root:setInterval(1/animation_fps * 1000, function () + local uptime = time.uptime() + for _, line in ipairs(lines) do + update_line(line, uptime) + end + if #dead_lines > 0 then + for i = #dead_lines, 1, -1 do + local index = dead_lines[i] + table.remove(lines, i) + end + dead_lines = {} + end + end) + end +end diff --git a/res/layouts/pages/scripts.xml.lua b/res/layouts/pages/scripts.xml.lua index 259792b8..3529b3d2 100644 --- a/res/layouts/pages/scripts.xml.lua +++ b/res/layouts/pages/scripts.xml.lua @@ -37,4 +37,6 @@ end function on_open() refresh() + + input.add_callback("key:f5", refresh, document.root) end diff --git a/res/layouts/templates/chat_line.xml b/res/layouts/templates/chat_line.xml new file mode 100644 index 00000000..b9939218 --- /dev/null +++ b/res/layouts/templates/chat_line.xml @@ -0,0 +1,3 @@ + + diff --git a/res/modules/gui_util.lua b/res/modules/gui_util.lua deleted file mode 100644 index d2983765..00000000 --- a/res/modules/gui_util.lua +++ /dev/null @@ -1,36 +0,0 @@ -local gui_util = {} - ---- Parse `pagename?arg1=value1&arg2=value2` queries ---- @param query page query string ---- @return page_name, args_table -function gui_util.parse_query(query) - local args = {} - local name - - local index = string.find(query, '?') - if index then - local argstr = string.sub(query, index + 1) - name = string.sub(query, 1, index - 1) - - for key, value in string.gmatch(argstr, "([^=&]*)=([^&]*)") do - args[key] = value - end - else - name = query - end - return name, args -end - ---- @param query page query string ---- @return document_id -function gui_util.load_page(query) - local name, args = gui_util.parse_query(query) - local filename = file.find(string.format("layouts/pages/%s.xml", name)) - if filename then - name = file.prefix(filename)..":pages/"..name - gui.load_document(filename, name, args) - return name - end -end - -return gui_util diff --git a/res/modules/internal/gui_util.lua b/res/modules/internal/gui_util.lua new file mode 100644 index 00000000..3cf84a33 --- /dev/null +++ b/res/modules/internal/gui_util.lua @@ -0,0 +1,107 @@ +local gui_util = { + local_dispatchers = {} +} + +--- Parse `pagename?arg1=value1&arg2=value2` queries +--- @param query page query string +--- @return page_name, args_table +function gui_util.parse_query(query) + local args = {} + local name + + local index = string.find(query, '?') + if index then + local argstr = string.sub(query, index + 1) + name = string.sub(query, 1, index - 1) + + for key, value in string.gmatch(argstr, "([^=&]*)=([^&]*)") do + args[key] = value + end + else + name = query + end + return name, args +end + +--- @param query page query string +--- @return document_id +function gui_util.load_page(query) + local name, args = gui_util.parse_query(query) + for i = #gui_util.local_dispatchers, 1, -1 do + local newname, newargs = gui_util.local_dispatchers[i](name, args) + name = newname or name + args = newargs or args + end + local filename = file.find(string.format("layouts/pages/%s.xml", name)) + if filename then + name = file.prefix(filename)..":pages/"..name + gui.load_document(filename, name, args) + return name + end +end + +function gui_util.add_page_dispatcher(dispatcher) + if type(dispatcher) ~= "function" then + error("function expected") + end + table.insert(gui_util.local_dispatchers, dispatcher) +end + +function gui_util.reset_local() + gui_util.local_dispatchers = {} +end + +-- class designed for simple UI-nodes access via properties syntax +local Element = {} +function Element.new(docname, name) + return setmetatable({docname=docname, name=name}, { + __index=function(self, k) + return gui.getattr(self.docname, self.name, k) + end, + __newindex=function(self, k, v) + gui.setattr(self.docname, self.name, k, v) + end + }) +end + +-- the engine automatically creates an instance for every ui document (layout) +local Document = {} +function Document.new(docname) + return setmetatable({name=docname}, { + __index=function(self, k) + local elem = Element.new(self.name, k) + rawset(self, k, elem) + return elem + end + }) +end + +local RadioGroup = {} +function RadioGroup:set(key) + if type(self) ~= 'table' then + error("called as non-OOP via '.', use radiogroup:set") + end + if self.current then + self.elements[self.current].enabled = true + end + self.elements[key].enabled = false + self.current = key + if self.callback then + self.callback(key) + end +end +function RadioGroup:__call(elements, onset, default) + local group = setmetatable({ + elements=elements, + callback=onset, + current=nil + }, {__index=self}) + group:set(default) + return group +end +setmetatable(RadioGroup, RadioGroup) + +gui_util.Document = Document +gui_util.RadioGroup = RadioGroup + +return gui_util diff --git a/res/modules/internal/stdcomp.lua b/res/modules/internal/stdcomp.lua index 6c77af1d..9e208038 100644 --- a/res/modules/internal/stdcomp.lua +++ b/res/modules/internal/stdcomp.lua @@ -49,6 +49,7 @@ local Skeleton = {__index={ set_visible=function(self, i, b) return __skeleton.set_visible(self.eid, i, b) end, get_color=function(self) return __skeleton.get_color(self.eid) end, set_color=function(self, color) return __skeleton.set_color(self.eid, color) end, + set_interpolated=function(self, b) return __skeleton.set_interpolated(self.eid, b) end, }} local function new_Skeleton(eid) @@ -66,6 +67,7 @@ local Entity = {__index={ get_uid=function(self) return self.eid end, def_index=function(self) return entities.get_def(self.eid) end, def_name=function(self) return entities.def_name(entities.get_def(self.eid)) end, + get_player=function(self) return entities.get_player(self.eid) end, }} local entities = {} diff --git a/res/scripts/stdcmd.lua b/res/scripts/stdcmd.lua index ccb65a71..95b37007 100644 --- a/res/scripts/stdcmd.lua +++ b/res/scripts/stdcmd.lua @@ -260,7 +260,7 @@ console.add_command( "chat text:str", "Send chat message", function (args, kwargs) - console.log("[you] "..args[1]) + console.chat("[you] "..args[1]) end ) diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 71ba2f4f..78228254 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -146,64 +146,16 @@ function events.emit(event, ...) return result end --- class designed for simple UI-nodes access via properties syntax -local Element = {} -function Element.new(docname, name) - return setmetatable({docname=docname, name=name}, { - __index=function(self, k) - return gui.getattr(self.docname, self.name, k) - end, - __newindex=function(self, k, v) - gui.setattr(self.docname, self.name, k, v) - end - }) -end +gui_util = require "core:internal/gui_util" --- the engine automatically creates an instance for every ui document (layout) -Document = {} -function Document.new(docname) - return setmetatable({name=docname}, { - __index=function(self, k) - local elem = Element.new(self.name, k) - rawset(self, k, elem) - return elem - end - }) -end - -local _RadioGroup = {} -function _RadioGroup:set(key) - if type(self) ~= 'table' then - error("called as non-OOP via '.', use radiogroup:set") - end - if self.current then - self.elements[self.current].enabled = true - end - self.elements[key].enabled = false - self.current = key - if self.callback then - self.callback(key) - end -end -function _RadioGroup:__call(elements, onset, default) - local group = setmetatable({ - elements=elements, - callback=onset, - current=nil - }, {__index=_RadioGroup}) - group:set(default) - return group -end -setmetatable(_RadioGroup, _RadioGroup) -RadioGroup = _RadioGroup +Document = gui_util.Document +RadioGroup = gui_util.RadioGroup +__vc_page_loader = gui_util.load_page _GUI_ROOT = Document.new("core:root") _MENU = _GUI_ROOT.menu menu = _MENU -local gui_util = require "core:gui_util" -__vc_page_loader = gui_util.load_page - --- Console library extension --- console.cheats = {} @@ -225,6 +177,11 @@ function console.log(...) log_element:paste(text) end +function console.chat(...) + console.log(...) + events.emit("core:chat", ...) +end + function gui.template(name, params) local text = file.read(file.find("layouts/templates/"..name..".xml")) for k,v in pairs(params) do @@ -385,6 +342,16 @@ function __vc_on_hud_open() hud.show_overlay("core:console", false, {"chat"}) end) end) + input.add_callback("key:escape", function() + if hud.is_paused() then + hud.resume() + elseif hud.is_inventory_open() then + hud.close_inventory() + else + hud.pause() + end + end) + hud.open_permanent("core:ingame_chat") end local RULES_FILE = "world:rules.toml" @@ -408,6 +375,7 @@ end function __vc_on_world_quit() _rules.clear() + gui_util:reset_local() end local __vc_coroutines = {} @@ -470,7 +438,10 @@ function __process_post_runnables() local dead = {} for name, co in pairs(__vc_named_coroutines) do - coroutine.resume(co) + local success, err = coroutine.resume(co) + if not success then + debug.error(err) + end if coroutine.status(co) == "dead" then table.insert(dead, name) end diff --git a/src/content/ContentReport.cpp b/src/content/ContentReport.cpp index 605b822c..7de04be5 100644 --- a/src/content/ContentReport.cpp +++ b/src/content/ContentReport.cpp @@ -76,8 +76,7 @@ std::shared_ptr ContentReport::create( } auto root = files::read_json(filename); - // TODO: remove default value 2 in 0.24 - uint regionsVersion = 2U; + uint regionsVersion = 2U; // old worlds compatibility (pre 0.23) root.at("region-version").get(regionsVersion); auto& blocklist = root["blocks"]; auto& itemlist = root["items"]; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 9184fdd6..ce29e8c1 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -217,6 +217,7 @@ void Engine::renderFrame() { Viewport viewport(Window::width, Window::height); DrawContext ctx(nullptr, viewport, nullptr); gui->draw(ctx, *assets); + gui->postAct(); } void Engine::saveSettings() { @@ -272,7 +273,7 @@ PacksManager Engine::createPacksManager(const fs::path& worldFolder) { return manager; } -void Engine::setLevelConsumer(consumer> levelConsumer) { +void Engine::setLevelConsumer(OnWorldOpen levelConsumer) { this->levelConsumer = std::move(levelConsumer); } @@ -446,14 +447,14 @@ void Engine::setLanguage(std::string locale) { langs::setup(paths.getResourcesFolder(), std::move(locale), contentPacks); } -void Engine::onWorldOpen(std::unique_ptr level) { +void Engine::onWorldOpen(std::unique_ptr level, int64_t localPlayer) { logger.info() << "world open"; - levelConsumer(std::move(level)); + levelConsumer(std::move(level), localPlayer); } void Engine::onWorldClosed() { logger.info() << "world closed"; - levelConsumer(nullptr); + levelConsumer(nullptr, -1); } void Engine::quit() { diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index af9f7fb9..406d420a 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -53,6 +53,8 @@ struct CoreParameters { std::filesystem::path scriptFile; }; +using OnWorldOpen = std::function, int64_t)>; + class Engine : public util::ObjectsKeeper { CoreParameters params; EngineSettings settings; @@ -71,7 +73,7 @@ class Engine : public util::ObjectsKeeper { std::unique_ptr gui; PostRunnables postRunnables; Time time; - consumer> levelConsumer; + OnWorldOpen levelConsumer; bool quitSignal = false; void loadControls(); @@ -134,7 +136,7 @@ public: /// @brief Get engine resource paths controller ResPaths* getResPaths(); - void onWorldOpen(std::unique_ptr level); + void onWorldOpen(std::unique_ptr level, int64_t localPlayer); void onWorldClosed(); void quit(); @@ -166,7 +168,7 @@ public: PacksManager createPacksManager(const fs::path& worldFolder); - void setLevelConsumer(consumer> levelConsumer); + void setLevelConsumer(OnWorldOpen levelConsumer); SettingsHandler& getSettingsHandler(); diff --git a/src/engine/Mainloop.cpp b/src/engine/Mainloop.cpp index e0e64d10..2de6291d 100644 --- a/src/engine/Mainloop.cpp +++ b/src/engine/Mainloop.cpp @@ -15,14 +15,16 @@ Mainloop::Mainloop(Engine& engine) : engine(engine) { void Mainloop::run() { auto& time = engine.getTime(); - engine.setLevelConsumer([this](auto level) { + engine.setLevelConsumer([this](auto level, int64_t localPlayer) { if (level == nullptr) { // destroy LevelScreen and run quit callbacks engine.setScreen(nullptr); // create and go to menu screen engine.setScreen(std::make_shared(engine)); } else { - engine.setScreen(std::make_shared(engine, std::move(level))); + engine.setScreen(std::make_shared( + engine, std::move(level), localPlayer + )); } }); diff --git a/src/engine/ServerMainloop.cpp b/src/engine/ServerMainloop.cpp index b97919be..954c2a11 100644 --- a/src/engine/ServerMainloop.cpp +++ b/src/engine/ServerMainloop.cpp @@ -30,7 +30,7 @@ void ServerMainloop::run() { logger.info() << "nothing to do"; return; } - engine.setLevelConsumer([this](auto level) { + engine.setLevelConsumer([this](auto level, auto) { setLevel(std::move(level)); }); diff --git a/src/frontend/debug_panel.cpp b/src/frontend/debug_panel.cpp index a234c38a..779597e1 100644 --- a/src/frontend/debug_panel.cpp +++ b/src/frontend/debug_panel.cpp @@ -13,7 +13,9 @@ #include "graphics/render/ParticlesRenderer.hpp" #include "graphics/render/ChunksRenderer.hpp" #include "logic/scripting/scripting.hpp" +#include "network/Network.hpp" #include "objects/Player.hpp" +#include "objects/Players.hpp" #include "objects/Entities.hpp" #include "objects/EntityDef.hpp" #include "physics/Hitbox.hpp" @@ -41,6 +43,7 @@ static std::shared_ptr