diff --git a/modules/game/game.lua b/modules/game/game.lua index d1e8cc19..6231f7e3 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -1,3 +1,5 @@ +require 'textmessage' + -- private functions local function onGameKeyPress(self, keyCode, keyChar, keyboardModifiers) if keyboardModifiers == KeyboardCtrlModifier then @@ -13,15 +15,16 @@ local function onGameKeyPress(self, keyCode, keyChar, keyboardModifiers) end local function createMainInterface() - gameUi = loadUI('/game/ui/gameinterface.otui', UI.root) - gameUi.onKeyPress = onGameKeyPress + Game.gameUi = loadUI('/game/ui/gameinterface.otui', UI.root) + Game.gameMapUi = Game.gameUi:getChildById('gameMap') + Game.gameUi.onKeyPress = onGameKeyPress end local function destroyMainInterface() if gameUi then - gameUi:destroy() - gameUi = nil + Game.gameUi:destroy() + Game.gameUi = nil end end diff --git a/modules/game/textmessage.lua b/modules/game/textmessage.lua new file mode 100644 index 00000000..aa1c0b09 --- /dev/null +++ b/modules/game/textmessage.lua @@ -0,0 +1,15 @@ +local textMessageWidget + +function Game.onTextMessage(message) + if textMessageWidget then + textMessageWidget:destroy() + end + + local newTextMessageWidget = loadUI('/game/ui/textmessage.otui', Game.gameMapUi) + time = #message * 75 + newTextMessageWidget:setText(message) + scheduleEvent(function() + newTextMessageWidget:destroy() + end, time) + textMessageWidget = newTextMessageWidget +end diff --git a/modules/game/ui/textmessage.otui b/modules/game/ui/textmessage.otui new file mode 100644 index 00000000..2ebb426f --- /dev/null +++ b/modules/game/ui/textmessage.otui @@ -0,0 +1,8 @@ +Label + font: tibia-12px-rounded + color: white + height: 16 + align: center + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right \ No newline at end of file diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index fe176294..e3e89a93 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -76,6 +76,8 @@ void UIWidget::destroy() // remove itself from parent if(UIWidgetPtr parent = getParent()) parent->removeChild(asUIWidget()); + setVisible(false); + setEnabled(false); } void UIWidget::render() diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index d700eb0d..b4febee8 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -97,6 +97,11 @@ void Game::processLogout() } } +void Game::processTextMessage(const std::string& message) +{ + g_lua.callGlobalField("Game","onTextMessage", message); +} + void Game::walk(Otc::Direction direction) { diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 5ea22fcb..b431e40f 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -32,18 +32,20 @@ public: void init(); void terminate(); + // login/logout related void loginWorld(const std::string& account, const std::string& password, const std::string& worldHost, int worldPort, const std::string& characterName); void cancelLogin(); void logout(bool force); - void processLoginError(const std::string& error); void processConnectionError(const boost::system::error_code& error); void processLogin(const LocalPlayerPtr& localPlayer); void processLogout(); + void processTextMessage(const std::string& message); + void walk(Otc::Direction direction); void turn(Otc::Direction direction); diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index 77a03c8b..be90a3e5 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -34,7 +34,7 @@ void ProtocolGame::parseMessage(InputMessage& msg) { while(!msg.eof()) { uint8 opt = msg.getU8(); - dump << "protocol id:" << std::hex << (int)opt; + //dump << "protocol id:" << std::hex << (int)opt; switch(opt) { case 0x0A: @@ -757,7 +757,9 @@ void ProtocolGame::parseTextMessage(InputMessage& msg) { msg.getU8(); // messageType std::string message = msg.getString(); - //logDebug(message); + + // must be scheduled because the map may not exist yet + g_dispatcher.addEvent(std::bind(&Game::processTextMessage, &g_game, message)); } void ProtocolGame::parseCancelWalk(InputMessage& msg) diff --git a/src/otclient/ui/uimap.cpp b/src/otclient/ui/uimap.cpp index d9fdbee2..c203aeaf 100644 --- a/src/otclient/ui/uimap.cpp +++ b/src/otclient/ui/uimap.cpp @@ -31,13 +31,8 @@ void UIMap::setup() void UIMap::render() { - if(g_game.isOnline()) { - Rect mapRect = m_rect; - Size mapSize(15*32, 11*32); - mapSize.scale(mapRect.size(), Fw::KeepAspectRatio); - mapRect.setSize(mapSize); - g_map.draw(mapRect); - } + if(g_game.isOnline()) + g_map.draw(m_rect); UIWidget::render(); } @@ -92,3 +87,13 @@ bool UIMap::onMousePress(const Point& mousePos, Fw::MouseButton button) { return UIWidget::onMousePress(mousePos, button); } + +void UIMap::onGeometryUpdate(const Rect& oldRect, const Rect& newRect) +{ + Rect mapRect = newRect; + Size mapSize(15*32, 11*32); + mapSize.scale(mapRect.size(), Fw::KeepAspectRatio); + mapRect.setSize(mapSize); + if(mapRect != newRect) + setRect(mapRect); +} diff --git a/src/otclient/ui/uimap.h b/src/otclient/ui/uimap.h index d903818e..f9ecd2f4 100644 --- a/src/otclient/ui/uimap.h +++ b/src/otclient/ui/uimap.h @@ -35,6 +35,7 @@ public: protected: virtual bool onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers); virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); + virtual void onGeometryUpdate(const Rect& oldRect, const Rect& newRect); private: };