diff --git a/doc/en/scripting/ui.md b/doc/en/scripting/ui.md index 7ce304b8c..22a878944 100644 --- a/doc/en/scripting/ui.md +++ b/doc/en/scripting/ui.md @@ -236,3 +236,12 @@ Properties: | Name | Type | Read | Write | Description | | --------- | ---- | ---- | ----- | ------------------------------------------------- | | inventory | int | yes | yes | id of the inventory to which the element is bound | + +## Slot + +Properties: + +| Name | Type | Read | Write | Description | +| --------- | ---- | ---- | ----- | -------------------------------------------------- | +| inventory | int | yes | no | id of the inventory to which the element is bound | +| slotIndex | int | yes | no | index of the slot to which the element is attached | diff --git a/doc/ru/scripting/ui.md b/doc/ru/scripting/ui.md index 963e8b004..05b448a43 100644 --- a/doc/ru/scripting/ui.md +++ b/doc/ru/scripting/ui.md @@ -237,3 +237,12 @@ Canvas.decode(data: Bytearray, format: str) -> Canvas |-----------|-----|--------|--------|-------------------------------------------| | inventory | int | да | да | id инвентаря, к которому привязан элемент | +## Слот (slot) + +Свойства: + +| Название | Тип | Чтение | Запись | Описание | +|-----------|-----|--------|--------|-------------------------------------------| +| inventory | int | да | нет | id инвентаря, к которому привязан элемент | +| slotIndex | int | да | нет | индекс слота, к которому примязан элемент | + diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 6ddc6744c..d40ab3b8e 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -470,7 +470,9 @@ void Hud::showExchangeSlot() { SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr) ); exchangeSlot->setId("hud.exchange-slot"); - exchangeSlot->bind(exchangeSlotInv->getId(), exchangeSlotInv->getSlot(0), &content); + exchangeSlot->bind( + exchangeSlotInv->getId(), exchangeSlotInv->getSlot(0), 0, &content + ); exchangeSlot->setColor(glm::vec4()); exchangeSlot->setInteractive(false); exchangeSlot->setZIndex(1); diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index d3a747225..2d610c7ca 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -382,7 +382,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { if (layout.rightClick) { - layout.rightClick(inventoryid, stack); + layout.rightClick(inventoryId, stack); if (layout.updateFunc) { layout.updateFunc(layout.index, stack); } @@ -452,10 +452,11 @@ const std::wstring& SlotView::getTooltip() const { } void SlotView::bind( - int64_t inventoryid, ItemStack& stack, const Content* content + int64_t inventoryid, ItemStack& stack, size_t index, const Content* content ) { - this->inventoryid = inventoryid; + this->inventoryId = inventoryid; bound = &stack; + this->index = index; this->content = content; } @@ -467,6 +468,14 @@ ItemStack& SlotView::getStack() { return *bound; } +int64_t SlotView::getInventoryId() const { + return inventoryId; +} + +size_t SlotView::getIndex() const { + return index; +} + InventoryView::InventoryView(GUI& gui) : Container(gui, glm::vec2()) { setColor(glm::vec4(0, 0, 0, 0.0f)); } @@ -510,9 +519,11 @@ void InventoryView::bind( this->inventory = inventory; this->content = content; for (auto slot : slots) { + const auto& layout = slot->getLayout(); slot->bind( inventory->getId(), - inventory->getSlot(slot->getLayout().index), + inventory->getSlot(layout.index), + layout.index, content ); } diff --git a/src/graphics/ui/elements/InventoryView.hpp b/src/graphics/ui/elements/InventoryView.hpp index b80f65e68..9275a2daa 100644 --- a/src/graphics/ui/elements/InventoryView.hpp +++ b/src/graphics/ui/elements/InventoryView.hpp @@ -61,8 +61,9 @@ namespace gui { SlotLayout layout; bool highlighted = false; - int64_t inventoryid = 0; + int64_t inventoryId = 0; ItemStack* bound = nullptr; + size_t index = 0; void performLeftClick(ItemStack& stack, ItemStack& grabbed); void performRightClick(ItemStack& stack, ItemStack& grabbed); @@ -100,11 +101,14 @@ namespace gui { void bind( int64_t inventoryid, ItemStack& stack, + size_t index, const Content* content ); ItemStack& getStack(); const SlotLayout& getLayout() const; + int64_t getInventoryId() const; + size_t getIndex() const; static inline std::string EXCHANGE_SLOT_NAME = "exchange-slot"; }; diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index b08d54455..e8cc70186 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -209,6 +209,15 @@ static int p_get_inventory(UINode* node, lua::State* L) { if (auto inventory = dynamic_cast(node)) { auto inv = inventory->getInventory(); return lua::pushinteger(L, inv ? inv->getId() : 0); + } else if (auto slot = dynamic_cast(node)) { + return lua::pushinteger(L, slot->getInventoryId()); + } + return 0; +} + +static int p_get_slot_index(UINode* node, lua::State* L) { + if (auto slot = dynamic_cast(node)) { + return lua::pushinteger(L, slot->getIndex()); } return 0; } @@ -661,6 +670,7 @@ static int l_gui_getattr(lua::State* L) { {"reset", p_get_reset}, {"paste", p_get_paste}, {"inventory", p_get_inventory}, + {"slotIndex", p_get_slot_index}, {"focused", p_get_focused}, {"cursor", p_get_cursor}, {"data", p_get_data},