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