diff --git a/src/framework/core/eventdispatcher.cpp b/src/framework/core/eventdispatcher.cpp index dbd6fb8f..0113fe58 100644 --- a/src/framework/core/eventdispatcher.cpp +++ b/src/framework/core/eventdispatcher.cpp @@ -23,6 +23,7 @@ #include "eventdispatcher.h" #include +#include "timer.h" EventDispatcher g_eventDispatcher; @@ -53,10 +54,10 @@ void EventDispatcher::poll() int count = 0; while(m_pollEventsSize > 0) { if(count > 50) { - static bool reported = false; - if(!reported) { + static Timer reportTimer; + if(reportTimer.running() && reportTimer.ticksElapsed() > 250) { logError("ATTENTION the event list is not getting empty, this could be caused by some bad code"); - reported = true; + reportTimer.restart(); } break; } diff --git a/src/framework/ui/uimanager.cpp b/src/framework/ui/uimanager.cpp index 8844eb1b..e2c04328 100644 --- a/src/framework/ui/uimanager.cpp +++ b/src/framework/ui/uimanager.cpp @@ -88,10 +88,7 @@ void UIManager::inputEvent(const InputEvent& event) m_mouseReceiver->propagateOnMouseEvent(event.mousePos, widgetList); for(const UIWidgetPtr& widget : widgetList) { - if(widget->isFocusable()) { - if(UIWidgetPtr parent = widget->getParent()) - parent->focusChild(widget, Fw::MouseFocusReason); - } + widget->recursiveFocus(Fw::MouseFocusReason); if(widget->onMousePress(event.mousePos, event.mouseButton)) break; } diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index a516ee90..89271f12 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -579,6 +579,18 @@ void UIWidget::focus() parent->focusChild(asUIWidget(), Fw::ActiveFocusReason); } +void UIWidget::recursiveFocus(Fw::FocusReason reason) +{ + if(m_destroyed) + return; + + if(UIWidgetPtr parent = getParent()) { + if(m_focusable) + parent->focusChild(asUIWidget(), reason); + parent->recursiveFocus(reason); + } +} + void UIWidget::lower() { if(m_destroyed) diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index d678c998..218bb942 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -100,6 +100,7 @@ public: void lock(); void unlock(); void focus(); + void recursiveFocus(Fw::FocusReason reason); void lower(); void raise(); void grabMouse(); diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index 207aef95..d6eafed3 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -753,7 +753,6 @@ void Game::setChaseMode(Otc::ChaseModes chaseMode) { if(!canPerformGameAction()) return; - m_chaseMode = chaseMode; m_protocolGame->sendChangeFightModes(m_fightMode, m_chaseMode, m_safeFight); } @@ -762,7 +761,6 @@ void Game::setFightMode(Otc::FightModes fightMode) { if(!canPerformGameAction()) return; - m_fightMode = fightMode; m_protocolGame->sendChangeFightModes(m_fightMode, m_chaseMode, m_safeFight); } @@ -886,30 +884,16 @@ bool Game::canPerformGameAction() void Game::setAttackingCreature(const CreaturePtr& creature) { - if(m_attackingCreature) { - m_attackingCreature->hideStaticSquare(); - m_attackingCreature = nullptr; - } - - if(creature) { - creature->showStaticSquare(Color::red); - m_attackingCreature = creature; - } + CreaturePtr oldCreature = m_attackingCreature; + m_attackingCreature = creature; - g_lua.callGlobalField("g_game", "onAttackingCreatureChange", creature); + g_lua.callGlobalField("g_game", "onAttackingCreatureChange", creature, oldCreature); } void Game::setFollowingCreature(const CreaturePtr& creature) { - if(m_followingCreature) { - m_followingCreature->hideStaticSquare(); - m_followingCreature = nullptr; - } - - if(creature) { - creature->showStaticSquare(Color::green); - m_followingCreature = creature; - } + CreaturePtr oldCreature = m_followingCreature; + m_followingCreature = creature; - g_lua.callGlobalField("g_game", "onFollowingCreatureChange", creature); + g_lua.callGlobalField("g_game", "onFollowingCreatureChange", creature, oldCreature); }