Merge pull request #355 from opchik98/main
Feature #152 and potential fix #320
This commit is contained in:
commit
c902bcc6c7
@ -7,7 +7,11 @@ hud.open_inventory()
|
|||||||
-- Close inventory.
|
-- Close inventory.
|
||||||
hud.close_inventory()
|
hud.close_inventory()
|
||||||
|
|
||||||
-- Open block UI and inventory.
|
-- Open UI and inventory.
|
||||||
|
-- Throws an exception if has no UI layout.
|
||||||
|
hud.open(invid: int, layoutid: str)
|
||||||
|
|
||||||
|
-- Open block UI and inventory.
|
||||||
-- Throws an exception if block has no UI layout.
|
-- Throws an exception if block has no UI layout.
|
||||||
-- Returns block inventory ID (if *"inventory-size"=0* a virtual
|
-- Returns block inventory ID (if *"inventory-size"=0* a virtual
|
||||||
-- inventory will be created), and UI layout ID.
|
-- inventory will be created), and UI layout ID.
|
||||||
|
|||||||
@ -40,12 +40,18 @@ inventory.bind_block(invid: int, x: int, y: int, z: int)
|
|||||||
|
|
||||||
-- Unbind inventory from the specified block.
|
-- Unbind inventory from the specified block.
|
||||||
inventory.unbind_block(x: int, y: int, z: int)
|
inventory.unbind_block(x: int, y: int, z: int)
|
||||||
|
|
||||||
|
-- Remove inventory.
|
||||||
|
inventory.remove(invid: int)
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Unbound inventories will be deleted on world close.
|
> Unbound inventories will be deleted on world close.
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
|
-- Create inventory. Returns the created ID.
|
||||||
|
inventory.create(size: int) -> int
|
||||||
|
|
||||||
-- Create inventory copy. Returns the created copy ID.
|
-- Create inventory copy. Returns the created copy ID.
|
||||||
inventory.clone(invid: int) -> int
|
inventory.clone(invid: int) -> int
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,11 @@ hud.open_inventory()
|
|||||||
-- Закрывает инвентарь.
|
-- Закрывает инвентарь.
|
||||||
hud.close_inventory()
|
hud.close_inventory()
|
||||||
|
|
||||||
-- Открывает инвентарь и UI блока.
|
-- Открывает инвентарь и UI.
|
||||||
|
-- Если не имеет макета UI - бросается исключение.
|
||||||
|
hud.open(invid: int, layoutid: str)
|
||||||
|
|
||||||
|
-- Открывает инвентарь и UI блока.
|
||||||
-- Если блок не имеет макета UI - бросается исключение.
|
-- Если блок не имеет макета UI - бросается исключение.
|
||||||
-- Возвращает id инвентаря блока
|
-- Возвращает id инвентаря блока
|
||||||
-- (при *"inventory-size"=0* создаётся виртуальный инвентарь,
|
-- (при *"inventory-size"=0* создаётся виртуальный инвентарь,
|
||||||
|
|||||||
@ -23,7 +23,7 @@ inventory.set(
|
|||||||
count: int
|
count: int
|
||||||
)
|
)
|
||||||
|
|
||||||
-- Возращает размер инвентаря (число слотов).
|
-- Возвращает размер инвентаря (число слотов).
|
||||||
-- Если указанного инвентаря не существует, бросает исключение.
|
-- Если указанного инвентаря не существует, бросает исключение.
|
||||||
inventory.size(invid: int) -> int
|
inventory.size(invid: int) -> int
|
||||||
|
|
||||||
@ -47,13 +47,19 @@ inventory.bind_block(invid: int, x: int, y: int, z: int)
|
|||||||
|
|
||||||
-- Отвязывает инвентарь от блока.
|
-- Отвязывает инвентарь от блока.
|
||||||
inventory.unbind_block(x: int, y: int, z: int)
|
inventory.unbind_block(x: int, y: int, z: int)
|
||||||
|
|
||||||
|
-- Удаляет инвентарь.
|
||||||
|
inventory.remove(invid: int)
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Инвентари, не привязанные ни к одному из блоков, удаляются при выходе из мира.
|
> Инвентари, не привязанные ни к одному из блоков, удаляются при выходе из мира.
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
-- Создает копию инвентаря и возвращает id копии.
|
-- Создаёт инвентарь и возвращает id.
|
||||||
|
inventory.create(size: int) -> int
|
||||||
|
|
||||||
|
-- Создает копию инвентаря и возвращает id копии.
|
||||||
-- Если копируемого инвентаря не существует, возвращает 0.
|
-- Если копируемого инвентаря не существует, возвращает 0.
|
||||||
inventory.clone(invid: int) -> int
|
inventory.clone(invid: int) -> int
|
||||||
|
|
||||||
@ -62,5 +68,3 @@ inventory.clone(invid: int) -> int
|
|||||||
-- slotB будет выбран автоматически, если не указывать явно.
|
-- slotB будет выбран автоматически, если не указывать явно.
|
||||||
inventory.move(invA: int, slotA: int, invB: int, slotB: int)
|
inventory.move(invA: int, slotA: int, invB: int, slotB: int)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -388,6 +388,39 @@ void Hud::openInventory() {
|
|||||||
add(HudElement(hud_element_mode::inventory_bound, nullptr, exchangeSlot, false));
|
add(HudElement(hud_element_mode::inventory_bound, nullptr, exchangeSlot, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Hud::openInventory(
|
||||||
|
UiDocument* doc,
|
||||||
|
std::shared_ptr<Inventory> inv,
|
||||||
|
bool playerInventory
|
||||||
|
) {
|
||||||
|
if (inv == nullptr) {
|
||||||
|
// why try to open nox-existent inventory??
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isInventoryOpen()) {
|
||||||
|
closeInventory();
|
||||||
|
}
|
||||||
|
auto level = frontend->getLevel();
|
||||||
|
auto content = level->content;
|
||||||
|
secondInvView = std::dynamic_pointer_cast<InventoryView>(doc->getRoot());
|
||||||
|
if (secondInvView == nullptr) {
|
||||||
|
throw std::runtime_error("secondary UI root element must be 'inventory'");
|
||||||
|
}
|
||||||
|
secondUI = secondInvView;
|
||||||
|
|
||||||
|
if (playerInventory) {
|
||||||
|
openInventory();
|
||||||
|
} else {
|
||||||
|
inventoryOpen = true;
|
||||||
|
}
|
||||||
|
if (inv == nullptr) {
|
||||||
|
inv = level->inventories->createVirtual(secondInvView->getSlotsCount());
|
||||||
|
}
|
||||||
|
secondInvView->bind(inv, content);
|
||||||
|
add(HudElement(hud_element_mode::inventory_bound, doc, secondUI, false));
|
||||||
|
}
|
||||||
|
|
||||||
void Hud::openInventory(
|
void Hud::openInventory(
|
||||||
glm::ivec3 block,
|
glm::ivec3 block,
|
||||||
UiDocument* doc,
|
UiDocument* doc,
|
||||||
|
|||||||
@ -102,6 +102,8 @@ class Hud : public util::ObjectsKeeper {
|
|||||||
std::shared_ptr<gui::InventoryView> inventoryView = nullptr;
|
std::shared_ptr<gui::InventoryView> inventoryView = nullptr;
|
||||||
/// @brief Block inventory view
|
/// @brief Block inventory view
|
||||||
std::shared_ptr<gui::InventoryView> blockUI = nullptr;
|
std::shared_ptr<gui::InventoryView> blockUI = nullptr;
|
||||||
|
/// @brief Secondary inventory view
|
||||||
|
std::shared_ptr<gui::InventoryView> secondInvView = nullptr;
|
||||||
/// @brief Position of the block open
|
/// @brief Position of the block open
|
||||||
glm::ivec3 blockPos {};
|
glm::ivec3 blockPos {};
|
||||||
/// @brief Id of the block open (used to detect block destruction or replacement)
|
/// @brief Id of the block open (used to detect block destruction or replacement)
|
||||||
@ -145,6 +147,16 @@ public:
|
|||||||
|
|
||||||
/// @brief Show player inventory in inventory-mode
|
/// @brief Show player inventory in inventory-mode
|
||||||
void openInventory();
|
void openInventory();
|
||||||
|
|
||||||
|
/// @brief Show inventory in inventory-mode
|
||||||
|
/// @param doc ui layout
|
||||||
|
/// @param inv inventory
|
||||||
|
/// @param playerInventory show player inventory too
|
||||||
|
void openInventory(
|
||||||
|
UiDocument* doc,
|
||||||
|
std::shared_ptr<Inventory> inv,
|
||||||
|
bool playerInventory
|
||||||
|
);
|
||||||
|
|
||||||
/// @brief Show block inventory in inventory-mode
|
/// @brief Show block inventory in inventory-mode
|
||||||
/// @param block block position
|
/// @param block block position
|
||||||
|
|||||||
@ -36,6 +36,26 @@ static int l_close_inventory(lua::State*) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_open(lua::State* L) {
|
||||||
|
auto invid = lua::tointeger(L, 1);
|
||||||
|
auto layoutid = lua::require_string(L, 2);
|
||||||
|
bool playerInventory = !lua::toboolean(L, 3);
|
||||||
|
|
||||||
|
auto assets = engine->getAssets();
|
||||||
|
auto layout = assets->get<UiDocument>(layoutid);
|
||||||
|
if (layout == nullptr) {
|
||||||
|
throw std::runtime_error("there is no ui layout " + util::quote(layoutid));
|
||||||
|
}
|
||||||
|
|
||||||
|
hud->openInventory(
|
||||||
|
layout,
|
||||||
|
level->inventories->get(invid),
|
||||||
|
playerInventory
|
||||||
|
);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_open_block(lua::State* L) {
|
static int l_open_block(lua::State* L) {
|
||||||
auto x = lua::tointeger(L, 1);
|
auto x = lua::tointeger(L, 1);
|
||||||
auto y = lua::tointeger(L, 2);
|
auto y = lua::tointeger(L, 2);
|
||||||
@ -154,6 +174,7 @@ static int l_set_debug_cheats(lua::State* L) {
|
|||||||
const luaL_Reg hudlib[] = {
|
const luaL_Reg hudlib[] = {
|
||||||
{"open_inventory", lua::wrap<l_open_inventory>},
|
{"open_inventory", lua::wrap<l_open_inventory>},
|
||||||
{"close_inventory", lua::wrap<l_close_inventory>},
|
{"close_inventory", lua::wrap<l_close_inventory>},
|
||||||
|
{"open", lua::wrap<l_open>},
|
||||||
{"open_block", lua::wrap<l_open_block>},
|
{"open_block", lua::wrap<l_open_block>},
|
||||||
{"open_permanent", lua::wrap<l_open_permanent>},
|
{"open_permanent", lua::wrap<l_open_permanent>},
|
||||||
{"show_overlay", lua::wrap<l_show_overlay>},
|
{"show_overlay", lua::wrap<l_show_overlay>},
|
||||||
|
|||||||
@ -109,6 +109,26 @@ static int l_inventory_unbind_block(lua::State* L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_inventory_create(lua::State* L) {
|
||||||
|
auto invsize = lua::tointeger(L, 1);
|
||||||
|
auto inv = level->inventories->create(invsize);
|
||||||
|
if (inv == nullptr) {
|
||||||
|
return lua::pushinteger(L, 0);
|
||||||
|
}
|
||||||
|
return lua::pushinteger(L, inv->getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_inventory_remove(lua::State* L) {
|
||||||
|
auto invid = lua::tointeger(L, 1);
|
||||||
|
auto inv = get_inventory(invid);
|
||||||
|
if (inv == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
level->inventories->remove(invid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_inventory_clone(lua::State* L) {
|
static int l_inventory_clone(lua::State* L) {
|
||||||
auto id = lua::tointeger(L, 1);
|
auto id = lua::tointeger(L, 1);
|
||||||
auto clone = level->inventories->clone(id);
|
auto clone = level->inventories->clone(id);
|
||||||
@ -145,5 +165,7 @@ const luaL_Reg inventorylib[] = {
|
|||||||
{"get_block", lua::wrap<l_inventory_get_block>},
|
{"get_block", lua::wrap<l_inventory_get_block>},
|
||||||
{"bind_block", lua::wrap<l_inventory_bind_block>},
|
{"bind_block", lua::wrap<l_inventory_bind_block>},
|
||||||
{"unbind_block", lua::wrap<l_inventory_unbind_block>},
|
{"unbind_block", lua::wrap<l_inventory_unbind_block>},
|
||||||
|
{"create", lua::wrap<l_inventory_create>},
|
||||||
|
{"remove", lua::wrap<l_inventory_remove>},
|
||||||
{"clone", lua::wrap<l_inventory_clone>},
|
{"clone", lua::wrap<l_inventory_clone>},
|
||||||
{NULL, NULL}};
|
{NULL, NULL}};
|
||||||
|
|||||||
@ -13,7 +13,7 @@ Chunk::Chunk(int xpos, int zpos) : x(xpos), z(zpos) {
|
|||||||
top = CHUNK_H;
|
top = CHUNK_H;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Chunk::isEmpty() {
|
bool Chunk::isEmpty() const {
|
||||||
int id = -1;
|
int id = -1;
|
||||||
for (uint i = 0; i < CHUNK_VOL; i++) {
|
for (uint i = 0; i < CHUNK_VOL; i++) {
|
||||||
if (voxels[i].id != id) {
|
if (voxels[i].id != id) {
|
||||||
|
|||||||
@ -44,7 +44,7 @@ public:
|
|||||||
|
|
||||||
Chunk(int x, int z);
|
Chunk(int x, int z);
|
||||||
|
|
||||||
bool isEmpty();
|
bool isEmpty() const;
|
||||||
|
|
||||||
void updateHeights();
|
void updateHeights();
|
||||||
|
|
||||||
|
|||||||
@ -72,11 +72,9 @@ bool Window::isFocused() {
|
|||||||
|
|
||||||
void window_size_callback(GLFWwindow*, int width, int height) {
|
void window_size_callback(GLFWwindow*, int width, int height) {
|
||||||
if (width && height) {
|
if (width && height) {
|
||||||
if (Window::isFocused()) {
|
glViewport(0, 0, width, height);
|
||||||
glViewport(0, 0, width, height);
|
Window::width = width;
|
||||||
Window::width = width;
|
Window::height = height;
|
||||||
Window::height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Window::isFullscreen() && !Window::isMaximized()) {
|
if (!Window::isFullscreen() && !Window::isMaximized()) {
|
||||||
Window::getSettings()->width.set(width);
|
Window::getSettings()->width.set(width);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user