From 90d3acce2a87d4569ff2138b148c637889ffa657 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 2 Apr 2012 20:09:47 -0300 Subject: [PATCH] restore containers * implemente Container class * restore module containers * add lua bindings for std::map * improve grid layout * fixes in UIItem rendering * changes in miniwindow design --- modules/game/game.otmod | 3 +- modules/game/gameinterface.lua | 14 +- modules/game/images/miniwindow.png | Bin 40107 -> 40148 bytes modules/game/images/miniwindowbuttons.png | Bin 626 -> 758 bytes modules/game/styles/items.otui | 1 + modules/game/styles/miniwindow.otui | 4 +- modules/game_battle/battle.lua | 2 +- modules/game_containers/container.otui | 40 ++++- modules/game_containers/containers.lua | 178 ++++++++-------------- modules/game_containers/containers.otmod | 7 + src/framework/luascript/luavaluecasts.h | 35 +++++ src/framework/ui/uigridlayout.cpp | 38 ++++- src/framework/ui/uigridlayout.h | 6 + src/framework/ui/uihorizontallayout.cpp | 16 +- src/framework/ui/uiverticallayout.cpp | 16 +- src/framework/ui/uiwidget.cpp | 8 +- src/otclient/core/container.cpp | 77 ++++++++++ src/otclient/core/container.h | 33 ++++ src/otclient/core/game.cpp | 84 ++++++++-- src/otclient/core/game.h | 6 +- src/otclient/core/thing.cpp | 6 +- src/otclient/luafunctions.cpp | 25 ++- src/otclient/ui/uiitem.cpp | 7 +- 23 files changed, 428 insertions(+), 178 deletions(-) diff --git a/modules/game/game.otmod b/modules/game/game.otmod index 0feb7f2b..9810062f 100644 --- a/modules/game/game.otmod +++ b/modules/game/game.otmod @@ -17,8 +17,9 @@ Module - game_skills - game_inventory - game_combatcontrols - - game_battle + - game_containers - game_viplist + - game_battle - game_hotkeys @onLoad: | diff --git a/modules/game/gameinterface.lua b/modules/game/gameinterface.lua index 20f812a8..365a8827 100644 --- a/modules/game/gameinterface.lua +++ b/modules/game/gameinterface.lua @@ -140,10 +140,10 @@ function GameInterface.createThingMenu(menuPosition, lookThing, useThing, creatu if useThing then if useThing:isContainer() then if useThing:getParentContainer() then - menu:addOption('Open', function() g_game.open(useThing, useThing:getContainerId()) end) - menu:addOption('Open in new window', function() g_game.open(useThing, Containers.getFreeContainerId()) end) + menu:addOption('Open', function() g_game.open(useThing, useThing:getParentContainer()) end) + menu:addOption('Open in new window', function() g_game.open(useThing, nil) end) else - menu:addOption('Open', function() g_game.open(useThing, Containers.getFreeContainerId()) end) + menu:addOption('Open', function() g_game.open(useThing, nil) end) end else if useThing:isMultiUse() then @@ -256,10 +256,10 @@ function GameInterface.processMouseAction(menuPosition, mouseButton, autoWalk, l elseif useThing and keyboardModifiers == KeyboardCtrlModifier and (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then if useThing:isContainer() then if useThing:getParentContainer() then - g_game.open(useThing, useThing:getContainerId()) + g_game.open(useThing, useThing:getParentContainer()) return true else - g_game.open(useThing, Containers.getFreeContainerId()) + g_game.open(useThing, nil) return true end elseif useThing:isMultiUse() then @@ -281,10 +281,10 @@ function GameInterface.processMouseAction(menuPosition, mouseButton, autoWalk, l return true elseif multiUseThing:isContainer() then if multiUseThing:getParentContainer() then - g_game.open(multiUseThing, multiUseThing:getContainerId()) + g_game.open(multiUseThing, multiUseThing:getParentContainer()) return true else - g_game.open(multiUseThing, Containers.getFreeContainerId()) + g_game.open(multiUseThing, nil) return true end elseif multiUseThing:isMultiUse() then diff --git a/modules/game/images/miniwindow.png b/modules/game/images/miniwindow.png index fa291936a33643db375921e63d6533b9eb3bbd09..855daa5e0179c092b5bbd4758970e35c33ddafad 100644 GIT binary patch delta 37137 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 delta 36833 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 Xz1wQ-DCkemMXTz9i@y#9;9$Bhi1( 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 container.capacity then return end +local function onContainerAddItem(container, slot, item) + refreshContainerItems(container) +end - local i = container.itemCount - while i >= 1 do - local itemWidget = container:getChildByIndex(i) - if not itemWidget then return end - - local nextItemWidget = container:getChildByIndex(i+1) - if not nextItemWidget then return end - - local swapItem = itemWidget:getItem() - if swapItem then - swapItem:setPosition(nextItemWidget.position) - nextItemWidget:setItem(swapItem) - end - - i = i - 1 - end - - local itemWidget = container:getChildByIndex(1) - if not itemWidget then return end - item:setPosition(itemWidget.position) +local function onContainerUpdateItem(container, slot, item, oldItem) + local itemWidget = container.itemsPanel:getChildById('item' .. slot) itemWidget:setItem(item) - - container.itemCount = container.itemCount + 1 end -function Containers.onContainerUpdateItem(containerId, slot, item) - local container = containers[containerId] - if not container then return end - - local itemWidget = container:getChildByIndex(slot + 1) - if not itemWidget then return end - itemWidget:setItem(item) - item:setPosition(itemWidget.position) +local function onContainerRemoveItem(container, slot, item) + refreshContainerItems(container) end -function Containers.onContainerRemoveItem(containerId, slot) - local container = containers[containerId] - if not container then return end +function Containers.init() + importStyle 'container.otui' - local itemWidget = container:getChildByIndex(slot+1) - if not itemWidget then return end - itemWidget:setItem(nil) - - for i=slot,container.itemCount-2 do - local itemWidget = container:getChildByIndex(i+1) - if not itemWidget then return end - - local nextItemWidget = container:getChildByIndex(i+2) - if not nextItemWidget then return end - - local item = nextItemWidget:getItem() - local pos = item:getPosition() - pos.z = pos.z - 1 - item:setPosition(pos) - - itemWidget:setItem(item) - nextItemWidget:setItem(nil) - end - - container.itemCount = container.itemCount - 1 + connect(Container, { onOpen = onContainerOpen, + onClose = onContainerClose, + onAddItem = onContainerAddItem, + onUpdateItem = onContainerUpdateItem, + onRemoveItem = onContainerRemoveItem }) end -connect(g_game, { onGameStart = Containers.clean, - onGameEnd = Containers.clean, - onOpenContainer = Containers.onOpenContainer, - onCloseContainer = Containers.onCloseContainer, - onContainerAddItem = Containers.onContainerAddItem, - onContainerUpdateItem = Containers.onContainerUpdateItem, - onContainerRemoveItem = Containers.onContainerRemoveItem }) +function Containers.terminate() + disconnect(Container, { onOpen = onContainerOpen, + onClose = onContainerClose, + onAddItem = onContainerAddItem, + onUpdateItem = onContainerUpdateItem, + onRemoveItem = onContainerRemoveItem }) +end +function Containers.clean() + +end diff --git a/modules/game_containers/containers.otmod b/modules/game_containers/containers.otmod index bd4fa8d4..5654e135 100644 --- a/modules/game_containers/containers.otmod +++ b/modules/game_containers/containers.otmod @@ -4,5 +4,12 @@ Module author: OTClient team website: https://github.com/edubart/otclient + dependecies: + - game + @onLoad: | dofile 'containers' + Containers.init() + + @onUnload: | + Containers.terminate() diff --git a/src/framework/luascript/luavaluecasts.h b/src/framework/luascript/luavaluecasts.h index 976f15c0..fae0751f 100644 --- a/src/framework/luascript/luavaluecasts.h +++ b/src/framework/luascript/luavaluecasts.h @@ -135,6 +135,13 @@ void push_luavalue(const std::deque& vec); template bool luavalue_cast(int index, std::deque& vec); +// map +template +void push_luavalue(const std::map& map); + +template +bool luavalue_cast(int index, std::map& map); + // tuple template void push_luavalue(const std::tuple& tuple); @@ -299,6 +306,34 @@ bool luavalue_cast(int index, std::deque& vec) return false; } +template +void push_luavalue(const std::map& map) +{ + g_lua.newTable(); + for(auto& it : map) { + push_luavalue(it.first); + push_luavalue(it.second); + g_lua.rawSet(); + } +} + +template +bool luavalue_cast(int index, std::map& map) +{ + if(g_lua.isTable(index)) { + g_lua.pushNil(); + while(g_lua.next(index < 0 ? index-1 : index)) { + K key; + V value; + if(luavalue_cast(-1, value) && luavalue_cast(-2, key)) + map[key] = value; + g_lua.pop(); + } + return true; + } + return false; +} + template struct push_tuple_luavalue { template diff --git a/src/framework/ui/uigridlayout.cpp b/src/framework/ui/uigridlayout.cpp index 02c915cf..f16f75d4 100644 --- a/src/framework/ui/uigridlayout.cpp +++ b/src/framework/ui/uigridlayout.cpp @@ -23,12 +23,14 @@ #include "uigridlayout.h" #include "uiwidget.h" +#include + UIGridLayout::UIGridLayout(UIWidgetPtr parentWidget): UILayout(parentWidget) { m_cellSize = Size(16,16); m_cellSpacing = 0; m_numColumns = 1; - m_numLines = 1; + m_numLines = 0; } void UIGridLayout::applyStyle(const OTMLNodePtr& styleNode) @@ -49,6 +51,12 @@ void UIGridLayout::applyStyle(const OTMLNodePtr& styleNode) setNumColumns(node->value()); else if(node->tag() == "num-lines") setNumLines(node->value()); + else if(node->tag() == "fit-children") + setFitChildren(node->value()); + else if(node->tag() == "auto-spacing") + setAutoSpacing(node->value()); + else if(node->tag() == "flow") + setFlow(node->value()); } } @@ -71,24 +79,42 @@ bool UIGridLayout::internalUpdate() Rect clippingRect = parentWidget->getClippingRect(); Point topLeft = clippingRect.topLeft(); + int numColumns = m_numColumns; + if(m_flow && m_cellSize.width() > 0) + numColumns = clippingRect.width() / (m_cellSize.width() + m_cellSpacing); + + int cellSpacing = m_cellSpacing; + if(m_autoSpacing && numColumns > 1) + cellSpacing = (clippingRect.width() - numColumns * m_cellSize.width()) / (numColumns - 1); + int index = 0; + int preferredHeight = 0; for(const UIWidgetPtr& widget : widgets) { if(!widget->isExplicitlyVisible()) continue; - int line = index / m_numColumns; - int column = index % m_numColumns; - Point virtualPos = Point(column * (m_cellSize.width() + m_cellSpacing), line * (m_cellSize.height() + m_cellSpacing)); - Point pos = topLeft + virtualPos; + int line = index / numColumns; + int column = index % numColumns; + Point virtualPos = Point(column * (m_cellSize.width() + cellSpacing), line * (m_cellSize.height() + cellSpacing)); + preferredHeight = virtualPos.y + m_cellSize.height(); + Point pos = topLeft + virtualPos - parentWidget->getVirtualOffset(); if(widget->setRect(Rect(pos, m_cellSize))) changed = true; index++; - if(index >= m_numColumns * m_numLines) + if(m_numLines > 0 && index >= m_numColumns * m_numLines) break; } + preferredHeight += parentWidget->getPaddingTop() + parentWidget->getPaddingBottom(); + + if(m_fitChildren && preferredHeight != parentWidget->getHeight()) { + // must set the preferred height later + g_eventDispatcher.addEvent([=] { + parentWidget->setHeight(preferredHeight); + }); + } return changed; } diff --git a/src/framework/ui/uigridlayout.h b/src/framework/ui/uigridlayout.h index a8d6f523..d8937d19 100644 --- a/src/framework/ui/uigridlayout.h +++ b/src/framework/ui/uigridlayout.h @@ -40,6 +40,9 @@ public: void setCellSpacing(int spacing) { m_cellSpacing = spacing; update(); } void setNumColumns(int columns) { m_numColumns = columns; update(); } void setNumLines(int lines) { m_numLines = lines; update(); } + void setAutoSpacing(bool enable) { m_autoSpacing = enable; update(); } + void setFitChildren(bool enable) { m_fitChildren = enable; update(); } + void setFlow(bool enable) { m_flow = enable; update(); } virtual UIGridLayoutPtr asUIGridLayout() { return nullptr; } @@ -51,6 +54,9 @@ private: int m_cellSpacing; int m_numColumns; int m_numLines; + Boolean m_autoSpacing; + Boolean m_fitChildren; + Boolean m_flow; }; #endif diff --git a/src/framework/ui/uihorizontallayout.cpp b/src/framework/ui/uihorizontallayout.cpp index 22bba0e6..ac741016 100644 --- a/src/framework/ui/uihorizontallayout.cpp +++ b/src/framework/ui/uihorizontallayout.cpp @@ -48,7 +48,7 @@ bool UIHorizontalLayout::internalUpdate() bool changed = false; Rect clippingRect = parentWidget->getClippingRect(); Point pos = (m_alignRight) ? clippingRect.topRight() : clippingRect.topLeft(); - int prefferedWidth = 0; + int preferredWidth = 0; int gap; for(const UIWidgetPtr& widget : widgets) { @@ -59,7 +59,7 @@ bool UIHorizontalLayout::internalUpdate() gap = (m_alignRight) ? -(widget->getMarginRight()+widget->getWidth()) : widget->getMarginLeft(); pos.x += gap; - prefferedWidth += gap; + preferredWidth += gap; if(widget->isFixedSize()) { // center it @@ -77,16 +77,16 @@ bool UIHorizontalLayout::internalUpdate() gap = (m_alignRight) ? -widget->getMarginLeft() : (widget->getWidth() + widget->getMarginRight()); gap += m_spacing; pos.x += gap; - prefferedWidth += gap; + preferredWidth += gap; } - prefferedWidth -= m_spacing; - prefferedWidth += parentWidget->getPaddingLeft() + parentWidget->getPaddingRight(); + preferredWidth -= m_spacing; + preferredWidth += parentWidget->getPaddingLeft() + parentWidget->getPaddingRight(); - if(m_fitChildren && prefferedWidth != parentWidget->getWidth()) { - // must set the preffered width later + if(m_fitChildren && preferredWidth != parentWidget->getWidth()) { + // must set the preferred width later g_eventDispatcher.addEvent([=] { - parentWidget->setWidth(prefferedWidth); + parentWidget->setWidth(preferredWidth); }); } diff --git a/src/framework/ui/uiverticallayout.cpp b/src/framework/ui/uiverticallayout.cpp index 48808259..8acd7663 100644 --- a/src/framework/ui/uiverticallayout.cpp +++ b/src/framework/ui/uiverticallayout.cpp @@ -49,7 +49,7 @@ bool UIVerticalLayout::internalUpdate() Rect clippingRect = parentWidget->getClippingRect(); Point pos = (m_alignBottom) ? clippingRect.bottomLeft() : clippingRect.topLeft(); - int prefferedHeight = 0; + int preferredHeight = 0; int gap; for(const UIWidgetPtr& widget : widgets) { @@ -60,7 +60,7 @@ bool UIVerticalLayout::internalUpdate() gap = (m_alignBottom) ? -(widget->getMarginBottom()+widget->getHeight()) : widget->getMarginTop(); pos.y += gap; - prefferedHeight += gap; + preferredHeight += gap; if(widget->isFixedSize()) { // center it @@ -78,16 +78,16 @@ bool UIVerticalLayout::internalUpdate() gap = (m_alignBottom) ? -widget->getMarginTop() : (widget->getHeight() + widget->getMarginBottom()); gap += m_spacing; pos.y += gap; - prefferedHeight += gap; + preferredHeight += gap; } - prefferedHeight -= m_spacing; - prefferedHeight += parentWidget->getPaddingTop() + parentWidget->getPaddingBottom(); + preferredHeight -= m_spacing; + preferredHeight += parentWidget->getPaddingTop() + parentWidget->getPaddingBottom(); - if(m_fitChildren && prefferedHeight != parentWidget->getHeight()) { - // must set the preffered width later + if(m_fitChildren && preferredHeight != parentWidget->getHeight()) { + // must set the preferred width later g_eventDispatcher.addEvent([=] { - parentWidget->setHeight(prefferedHeight); + parentWidget->setHeight(preferredHeight); }); } diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index ebfeacfd..2f37c4ae 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -1300,10 +1300,10 @@ void UIWidget::onGeometryChange(const Rect& oldRect, const Rect& newRect) updateText(); // move children that is outside the parent rect to inside again - for(const UIWidgetPtr& child : m_children) { - if(!child->isAnchored()) - child->bindRectToParent(); - } + //for(const UIWidgetPtr& child : m_children) { + //if(!child->isAnchored()) + //child->bindRectToParent(); + //} } void UIWidget::onLayoutUpdate() diff --git a/src/otclient/core/container.cpp b/src/otclient/core/container.cpp index df12527a..0df11273 100644 --- a/src/otclient/core/container.cpp +++ b/src/otclient/core/container.cpp @@ -21,3 +21,80 @@ */ #include "container.h" +#include "item.h" + +Container::Container() +{ + m_id = -1; + m_itemId = 0; + m_capacity = 20; + m_name = "Container"; + m_hasParent = false; +} + +void Container::open(const ContainerPtr& previousContainer) +{ + callLuaField("onOpen", previousContainer); +} + +void Container::close() +{ + callLuaField("onClose"); +} + +void Container::addItem(const ItemPtr& item) +{ + m_items.push_front(item); + updateItemsPositions(); + + callLuaField("onAddItem", 0, item); +} + +void Container::addItems(const std::vector& items) +{ + for(const ItemPtr& item : items) + m_items.push_back(item); + updateItemsPositions(); +} + +void Container::updateItem(int slot, const ItemPtr& item) +{ + if(slot < 0 || slot >= (int)m_items.size()) { + logTraceError("slot not found"); + return; + } + + ItemPtr oldItem = m_items[slot]; + m_items[slot] = item; + item->setPosition(getSlotPosition(slot)); + + callLuaField("onUpdateItem", slot, item, oldItem); +} + +void Container::removeItem(int slot) +{ + if(slot < 0 || slot >= (int)m_items.size()) { + logTraceError("slot not found"); + return; + } + + ItemPtr item = m_items[slot]; + m_items.erase(m_items.begin() + slot); + + updateItemsPositions(); + + callLuaField("onRemoveItem", slot, item); +} + +ItemPtr Container::getItem(int slot) +{ + if(slot < 0 || slot >= (int)m_items.size()) + return nullptr; + return m_items[slot]; +} + +void Container::updateItemsPositions() +{ + for(int slot = 0; slot < (int)m_items.size(); ++slot) + m_items[slot]->setPosition(getSlotPosition(slot)); +} diff --git a/src/otclient/core/container.h b/src/otclient/core/container.h index e8fc1010..6381d579 100644 --- a/src/otclient/core/container.h +++ b/src/otclient/core/container.h @@ -32,6 +32,39 @@ class Container : public LuaObject public: Container(); + void open(const ContainerPtr& previousContainer); + void close(); + + void addItem(const ItemPtr& item); + void addItems(const std::vector& items); + void updateItem(int slot, const ItemPtr& item); + void removeItem(int slot); + ItemPtr getItem(int slot); + + Position getSlotPosition(int slot) { return Position(0xffff, m_id | 0x40, slot); } + + void setId(int id) { m_id = id; } + void setCapacity(int capacity) { m_capacity = capacity; } + void setName(std::string name) { m_name = name; } + void setItemId(uint16 itemId) { m_itemId = itemId; } + void setHasParent(bool hasParent) { m_hasParent = hasParent; } + + std::string getName() { return m_name; } + int getId() { return m_id; } + int getCapacity() { return m_capacity; } + int getItemsCount() { return m_items.size(); } + uint16 getItemId() { return m_itemId; } + bool hasParent() { return m_hasParent; } + +private: + void updateItemsPositions(); + + int m_id; + int m_capacity; + uint16 m_itemId; + std::string m_name; + bool m_hasParent; + std::deque m_items; }; #endif diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index faa66826..8dedf74b 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -25,6 +25,7 @@ #include "map.h" #include "tile.h" #include "creature.h" +#include "container.h" #include "statictext.h" #include #include @@ -166,30 +167,73 @@ void Game::processCreatureSpeak(const std::string& name, int level, Otc::SpeakTy g_lua.callGlobalField("g_game", "onCreatureSpeak", name, level, type, message, channelId, creaturePos); } -void Game::processOpenContainer(int containerId, int itemId, const std::string& name, int capacity, bool hasParent, const std::vector< ItemPtr >& items) +void Game::processOpenContainer(int containerId, int itemId, const std::string& name, int capacity, bool hasParent, const std::vector& items) { - g_lua.callGlobalField("g_game", "onOpenContainer", containerId, itemId, name, capacity, hasParent, items); + ContainerPtr previousContainer = getContainer(containerId); + ContainerPtr container = ContainerPtr(new Container()); + container->setId(containerId); + container->setCapacity(capacity); + container->setName(name); + container->setItemId(itemId); + container->setHasParent(hasParent); + m_containers[containerId] = container; + container->addItems(items); + + container->open(previousContainer); + if(previousContainer) + previousContainer->close(); } void Game::processCloseContainer(int containerId) { - g_lua.callGlobalField("g_game", "onCloseContainer", containerId); + ContainerPtr container = getContainer(containerId); + if(!container) { + logTraceError("container not found"); + return; + } + + auto it = m_containers.find(container->getId()); + if(it == m_containers.end() || it->second != container) { + logTraceError("invalid container"); + return; + } + + m_containers.erase(it); + + container->close(); } void Game::processContainerAddItem(int containerId, const ItemPtr& item) { - item->setPosition(Position(65535, containerId + 0x40, 0)); - g_lua.callGlobalField("g_game", "onContainerAddItem", containerId, item); + ContainerPtr container = getContainer(containerId); + if(!container) { + logTraceError("container not found"); + return; + } + + container->addItem(item); } void Game::processContainerUpdateItem(int containerId, int slot, const ItemPtr& item) { - g_lua.callGlobalField("g_game", "onContainerUpdateItem", containerId, slot, item); + ContainerPtr container = getContainer(containerId); + if(!container) { + logTraceError("container not found"); + return; + } + + container->updateItem(slot, item); } void Game::processContainerRemoveItem(int containerId, int slot) { - g_lua.callGlobalField("g_game", "onContainerRemoveItem", containerId, slot); + ContainerPtr container = getContainer(containerId); + if(!container) { + logTraceError("container not found"); + return; + } + + container->removeItem(slot); } void Game::processInventoryChange(int slot, const ItemPtr& item) @@ -542,19 +586,37 @@ void Game::useInventoryItemWith(int itemId, const ThingPtr& toThing) m_protocolGame->sendUseItemWith(pos, itemId, 0, toThing->getPosition(), toThing->getId(), toThing->getStackpos()); } -void Game::open(const ItemPtr& item, int containerId) +void Game::open(const ItemPtr& item, const ContainerPtr& previousContainer) { if(!canPerformGameAction() || !item) return; - m_protocolGame->sendUseItem(item->getPosition(), item->getId(), item->getStackpos(), containerId); + int id = 0; + if(!previousContainer) { + // find a free container id + while(m_containers.find(id) != m_containers.end()) + id++; + } else { + id = previousContainer->getId(); + } + + m_protocolGame->sendUseItem(item->getPosition(), item->getId(), item->getStackpos(), id); } -void Game::upContainer(int containerId) +void Game::openParent(const ContainerPtr& container) { if(!canPerformGameAction()) return; - m_protocolGame->sendUpContainer(containerId); + + m_protocolGame->sendUpContainer(container->getId()); +} + +void Game::close(const ContainerPtr& container) +{ + if(!canPerformGameAction()) + return; + + m_protocolGame->sendCloseContainer(container->getId()); } void Game::refreshContainer() diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 1ea0ffd4..bd3f0ba2 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -139,8 +139,9 @@ public: void useInventoryItemWith(int itemId, const ThingPtr& toThing); // container related - void open(const ItemPtr& item, int containerId); - void upContainer(int containerId); + void open(const ItemPtr& item, const ContainerPtr& previousContainer); + void openParent(const ContainerPtr& container); + void close(const ContainerPtr& container); void refreshContainer(); // attack/follow related @@ -218,6 +219,7 @@ public: bool isFollowing() { return !!m_followingCreature; } ContainerPtr getContainer(int index) { return m_containers[index]; } + std::map getContainers() { return m_containers; } CreaturePtr getAttackingCreature() { return m_attackingCreature; } CreaturePtr getFollowingCreature() { return m_followingCreature; } int getServerBeat() { return m_serverBeat; } diff --git a/src/otclient/core/thing.cpp b/src/otclient/core/thing.cpp index 73178887..c7d67a5c 100644 --- a/src/otclient/core/thing.cpp +++ b/src/otclient/core/thing.cpp @@ -56,8 +56,10 @@ const TilePtr& Thing::getTile() ContainerPtr Thing::getParentContainer() { - if(m_position.x == 0xFFFF && m_position.y & 0x40) - return g_game.getContainer(m_position.z); + if(m_position.x == 0xffff && m_position.y & 0x40) { + int containerId = m_position.y ^ 0x40; + return g_game.getContainer(containerId); + } return nullptr; } diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index e2de3764..aae3e011 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -95,7 +95,8 @@ void OTClient::registerLuaFunctions() g_lua.bindClassStaticFunction("g_game", "useInventoryItem", std::bind(&Game::useInventoryItem, &g_game, _1)); g_lua.bindClassStaticFunction("g_game", "useInventoryItemWith", std::bind(&Game::useInventoryItemWith, &g_game, _1, _2)); g_lua.bindClassStaticFunction("g_game", "open", std::bind(&Game::open, &g_game, _1, _2)); - g_lua.bindClassStaticFunction("g_game", "upContainer", std::bind(&Game::upContainer, &g_game, _1)); + g_lua.bindClassStaticFunction("g_game", "openParent", std::bind(&Game::openParent, &g_game, _1)); + g_lua.bindClassStaticFunction("g_game", "close", std::bind(&Game::close, &g_game, _1)); g_lua.bindClassStaticFunction("g_game", "refreshContainer", std::bind(&Game::refreshContainer, &g_game)); g_lua.bindClassStaticFunction("g_game", "attack", std::bind(&Game::attack, &g_game, _1)); g_lua.bindClassStaticFunction("g_game", "cancelAttack", std::bind(&Game::cancelAttack, &g_game)); @@ -147,6 +148,8 @@ void OTClient::registerLuaFunctions() g_lua.bindClassStaticFunction("g_game", "isDead", std::bind(&Game::isDead, &g_game)); g_lua.bindClassStaticFunction("g_game", "isAttacking", std::bind(&Game::isAttacking, &g_game)); g_lua.bindClassStaticFunction("g_game", "isFollowing", std::bind(&Game::isFollowing, &g_game)); + g_lua.bindClassStaticFunction("g_game", "getContainer", std::bind(&Game::getContainer, &g_game, _1)); + g_lua.bindClassStaticFunction("g_game", "getContainers", std::bind(&Game::getContainers, &g_game)); g_lua.bindClassStaticFunction("g_game", "getAttackingCreature", std::bind(&Game::getAttackingCreature, &g_game)); g_lua.bindClassStaticFunction("g_game", "getFollowingCreature", std::bind(&Game::getFollowingCreature, &g_game)); g_lua.bindClassStaticFunction("g_game", "getServerBeat", std::bind(&Game::getServerBeat, &g_game)); @@ -165,6 +168,26 @@ void OTClient::registerLuaFunctions() g_lua.registerClass(); g_lua.registerClass(); + g_lua.bindClassStaticFunction("create", []{ return ContainerPtr(new Container); }); + g_lua.bindClassMemberFunction("open", &Container::open); + g_lua.bindClassMemberFunction("close", &Container::close); + g_lua.bindClassMemberFunction("addItem", &Container::addItem); + g_lua.bindClassMemberFunction("addItems", &Container::addItems); + g_lua.bindClassMemberFunction("updateItem", &Container::updateItem); + g_lua.bindClassMemberFunction("removeItem", &Container::removeItem); + g_lua.bindClassMemberFunction("getItem", &Container::getItem); + g_lua.bindClassMemberFunction("getSlotPosition", &Container::getSlotPosition); + g_lua.bindClassMemberFunction("setId", &Container::setId); + g_lua.bindClassMemberFunction("setCapacity", &Container::setCapacity); + g_lua.bindClassMemberFunction("setName", &Container::setName); + g_lua.bindClassMemberFunction("setItemId", &Container::setItemId); + g_lua.bindClassMemberFunction("setHasParent", &Container::setHasParent); + g_lua.bindClassMemberFunction("getName", &Container::getName); + g_lua.bindClassMemberFunction("getId", &Container::getId); + g_lua.bindClassMemberFunction("getCapacity", &Container::getCapacity); + g_lua.bindClassMemberFunction("getItemsCount", &Container::getItemsCount); + g_lua.bindClassMemberFunction("getItemId", &Container::getItemId); + g_lua.bindClassMemberFunction("hasParent", &Container::hasParent); g_lua.registerClass(); g_lua.bindClassMemberFunction("setId", &Thing::setId); diff --git a/src/otclient/ui/uiitem.cpp b/src/otclient/ui/uiitem.cpp index dab5a786..8512b0a5 100644 --- a/src/otclient/ui/uiitem.cpp +++ b/src/otclient/ui/uiitem.cpp @@ -35,18 +35,17 @@ void UIItem::drawSelf() UIWidget::drawSelf(); if(m_item) { - Point topLeft = m_rect.bottomRight() - Point(32, 32) + Point(m_padding.left, m_padding.top); + Rect drawRect = getClippingRect(); + float scaleFactor = std::min(drawRect.width() / 32.0f, drawRect.height() / 32.0f); g_painter.setColor(Color::white); - m_item->draw(topLeft, 1, true); + m_item->draw(drawRect.topLeft(), scaleFactor, true); if(m_font && m_item->isStackable() && m_item->getCount() > 1) { std::string count = Fw::tostring(m_item->getCount()); g_painter.setColor(Color(231, 231, 231)); m_font->drawText(count, Rect(m_rect.topLeft(), m_rect.bottomRight() - Point(3, 0)), Fw::AlignBottomRight); } - - //m_font->renderText(Fw::unsafeCast(m_item->getId()), m_rect); } }