From d4afb712632cc6a86f888422f8e162a135e076c0 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Tue, 3 Apr 2012 11:15:11 -0300 Subject: [PATCH] clean containers when relogging --- modules/game_containers/containers.lua | 29 +++++++++++++++++++++----- src/framework/net/connection.cpp | 2 ++ src/framework/net/protocol.cpp | 6 ++++++ src/framework/ui/uiwidget.cpp | 8 +++---- src/otclient/core/game.cpp | 4 ++++ 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/modules/game_containers/containers.lua b/modules/game_containers/containers.lua index ad4636f5..f2643ace 100644 --- a/modules/game_containers/containers.lua +++ b/modules/game_containers/containers.lua @@ -1,4 +1,5 @@ Containers = {} + local function refreshContainerItems(container) for slot=0,container:getCapacity()-1 do local itemWidget = container.itemsPanel:getChildById('item' .. slot) @@ -48,22 +49,22 @@ local function onContainerOpen(container, previousContainer) end local function onContainerClose(container) - local containerWindow = container.window - if containerWindow then - containerWindow:destroy() - end + if container.window then container.window:destroy() end end local function onContainerAddItem(container, slot, item) + if not container.window then return end refreshContainerItems(container) end local function onContainerUpdateItem(container, slot, item, oldItem) + if not container.window then return end local itemWidget = container.itemsPanel:getChildById('item' .. slot) itemWidget:setItem(item) end local function onContainerRemoveItem(container, slot, item) + if not container.window then return end refreshContainerItems(container) end @@ -75,6 +76,9 @@ function Containers.init() onAddItem = onContainerAddItem, onUpdateItem = onContainerUpdateItem, onRemoveItem = onContainerRemoveItem }) + connect(Game, { onGameEnd = Containers.clean() }) + + Containers.reloadContainers() end function Containers.terminate() @@ -83,8 +87,23 @@ function Containers.terminate() onAddItem = onContainerAddItem, onUpdateItem = onContainerUpdateItem, onRemoveItem = onContainerRemoveItem }) + disconnect(Game, { onGameEnd = Containers.clean() }) + Containers = nil +end + +function Containers.reloadContainers() + Containers.clean() + for containerid,container in pairs(g_game.getContainers()) do + onContainerOpen(container) + end end function Containers.clean() - + for containerid,container in pairs(g_game.getContainers()) do + if container.window then + container.window:destroy() + container.window = nil + container.itemsPnale = nil + end + end end diff --git a/src/framework/net/connection.cpp b/src/framework/net/connection.cpp index bcc9c72e..34267529 100644 --- a/src/framework/net/connection.cpp +++ b/src/framework/net/connection.cpp @@ -123,6 +123,8 @@ void Connection::write(uint8* buffer, uint16 size) if(!m_sendEvent || m_sendEvent->isExecuted() || m_sendEvent->isCanceled()) { auto weakSelf = ConnectionWeakPtr(shared_from_this()); + + // wait 1 ms to do the real send m_sendEvent = g_eventDispatcher.scheduleEvent([=] { if(!weakSelf.lock()) return; diff --git a/src/framework/net/protocol.cpp b/src/framework/net/protocol.cpp index e17471ee..6e061c15 100644 --- a/src/framework/net/protocol.cpp +++ b/src/framework/net/protocol.cpp @@ -107,6 +107,12 @@ void Protocol::internalRecvHeader(uint8* buffer, uint16 size) void Protocol::internalRecvData(uint8* buffer, uint16 size) { + // process data only if really connected + if(!isConnected()) { + logTraceError("received data while disconnected"); + return; + } + memcpy(m_inputMessage.getBuffer() + InputMessage::CHECKSUM_POS, buffer, size); if(m_checksumEnabled) { diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index 2f37c4ae..ebfeacfd 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/game.cpp b/src/otclient/core/game.cpp index 8dedf74b..06e6f69b 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -48,7 +48,11 @@ void Game::resetGameStates() m_safeFight = true; m_followingCreature = nullptr; m_attackingCreature = nullptr; + + for(auto& it : m_containers) + (it.second)->close(); m_containers.clear(); + m_worldName = ""; }