From c60b677baa4aaf20fa97c9a6286bcdcba6d3b40f Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Fri, 26 Aug 2011 15:00:22 -0300 Subject: [PATCH] basic charlist --- modules/core_ui/styles/listboxes.otui | 2 +- modules/mainmenu/entergame.lua | 39 ++++++++++++++++++++-- modules/mainmenu/ui/charlist.otui | 14 ++++++++ src/framework/luascript/luafunctions.cpp | 1 + src/framework/luascript/luavaluecasts.h | 41 ++++++++++++++++++++++++ src/framework/ui/uilabel.cpp | 4 +-- src/framework/util/tools.h | 7 ++++ src/otclient/core/game.cpp | 4 +-- src/otclient/core/game.h | 2 +- src/otclient/net/protocolgame.cpp | 5 +-- src/otclient/net/protocolgame.h | 2 +- src/otclient/net/protocollogin.cpp | 19 +++++------ src/otclient/otclientluafunctions.cpp | 4 +++ 13 files changed, 120 insertions(+), 24 deletions(-) diff --git a/modules/core_ui/styles/listboxes.otui b/modules/core_ui/styles/listboxes.otui index 895ada93..ccab396b 100644 --- a/modules/core_ui/styles/listboxes.otui +++ b/modules/core_ui/styles/listboxes.otui @@ -1,5 +1,5 @@ TextList < UIWidget - size: 200 200 + layout: verticalBox border-image: source: /core_ui/images/panel_flat.png border: 4 \ No newline at end of file diff --git a/modules/mainmenu/entergame.lua b/modules/mainmenu/entergame.lua index 068dc042..192a68b0 100644 --- a/modules/mainmenu/entergame.lua +++ b/modules/mainmenu/entergame.lua @@ -1,3 +1,17 @@ +local account +local password + +function EnterGame_characterWindow_okClicked() + local charactersWindow = UI.root:getChildById('charactersWindow') + local selected = charactersWindow:getChildById('charactersList'):getFocusedChild() + if selected then + Game.loginWorld(account, password, selected.worldHost, selected.worldPort, selected.characterName) + charactersWindow:destroy() + mainMenu:hide() + end +end + + function EnterGame_connectToLoginServer() local protocolLogin = ProtocolLogin.create() @@ -27,12 +41,31 @@ function EnterGame_connectToLoginServer() displayInfoBox("Message of the day", motdText) Configs.set("motd", motdNumber) end - mainMenu:hide() + end + + protocolLogin.onCharacterList = function(protocol, characters, premDays) + loadBox:destroy() + local charactersWindow = UI.loadAndDisplayLocked('/mainmenu/ui/charlist.otui') + local charactersList = charactersWindow:getChildById('charactersList') + for i,characterInfo in ipairs(characters) do + local characterName = characterInfo[1] + local worldName = characterInfo[2] + local worldHost = characterInfo[3] + local worldIp = characterInfo[4] + + local label = UILabel.create() + charactersList:addChild(label) + label:setText(characterName .. ' (' .. worldName .. ')') + label:setStyle('CharactersListLabel') + label.characterName = characterName + label.worldHost = worldHost + label.worldPort = worldIp + end end local enterGameWindow = UI.root:getChildById("enterGameWindow") - local account = enterGameWindow:getChildById("accountNameLineEdit"):getText() - local password = enterGameWindow:getChildById("accountPasswordLineEdit"):getText() + account = enterGameWindow:getChildById("accountNameLineEdit"):getText() + password = enterGameWindow:getChildById("accountPasswordLineEdit"):getText() protocolLogin:login(account, password) enterGameWindow:destroy() diff --git a/modules/mainmenu/ui/charlist.otui b/modules/mainmenu/ui/charlist.otui index 70d92c2a..d72a4593 100644 --- a/modules/mainmenu/ui/charlist.otui +++ b/modules/mainmenu/ui/charlist.otui @@ -1,3 +1,16 @@ +CharactersListLabel < Label + image: /core_ui/images/empty_rect.png + font: helvetica-12px-bold + background-color: #00000000 + focusable: true + margin.left: 1 + margin.right: 1 + margin.top: 1 + + state.focus: + background-color: #ffffff22 + color: #ffffff + MainWindow id: charactersWindow title: Charlist @@ -19,6 +32,7 @@ MainWindow anchors.bottom: parent.bottom margin.bottom: 16 margin.right: 16 + onClick: EnterGame_characterWindow_okClicked() Button id: buttonCancel diff --git a/src/framework/luascript/luafunctions.cpp b/src/framework/luascript/luafunctions.cpp index 5a82c1ad..39f52415 100644 --- a/src/framework/luascript/luafunctions.cpp +++ b/src/framework/luascript/luafunctions.cpp @@ -42,6 +42,7 @@ void LuaInterface::registerFunctions() g_lua.bindClassMemberFunction("getChildById", &UIWidget::getChildById); g_lua.bindClassMemberFunction("getChildByIndex", &UIWidget::getChildByIndex); g_lua.bindClassMemberFunction("getChildCount", &UIWidget::getChildCount); + g_lua.bindClassMemberFunction("getFocusedChild", &UIWidget::getFocusedChild); g_lua.bindClassMemberFunction("insertChild", &UIWidget::insertChild); g_lua.bindClassMemberFunction("removeChild", &UIWidget::removeChild); g_lua.bindClassMemberFunction("addChild", &UIWidget::addChild); diff --git a/src/framework/luascript/luavaluecasts.h b/src/framework/luascript/luavaluecasts.h index f5cfd4d2..91f2cd3e 100644 --- a/src/framework/luascript/luavaluecasts.h +++ b/src/framework/luascript/luavaluecasts.h @@ -76,6 +76,13 @@ template typename std::enable_if::value, bool>::type luavalue_cast(int index, std::function& func); +// vector +template +void push_luavalue(const std::vector& vec); + +// tuple +template +void push_luavalue(const std::tuple& tuple); // start definitions @@ -181,4 +188,38 @@ luavalue_cast(int index, std::function& func) { return false; } + +template +void push_luavalue(const std::vector& vec) { + g_lua.newTable(); + int i = 1; + for(const T& v : vec) { + push_luavalue(v); + g_lua.rawSeti(i); + i++; + } +} + +template +struct push_tuple_luavalue { + template + static void call(const Tuple& tuple) { + push_luavalue(std::get(tuple)); + g_lua.rawSeti(N); + push_tuple_luavalue::call(tuple); + } +}; + +template<> +struct push_tuple_luavalue<0> { + template + static void call(const Tuple& tuple) { } +}; + +template +void push_luavalue(const std::tuple& tuple) { + g_lua.newTable(); + push_tuple_luavalue::call(tuple); +} + #endif diff --git a/src/framework/ui/uilabel.cpp b/src/framework/ui/uilabel.cpp index 6fce8347..f873f193 100644 --- a/src/framework/ui/uilabel.cpp +++ b/src/framework/ui/uilabel.cpp @@ -20,9 +20,7 @@ void UILabel::setText(const std::string& text) m_text = text; // auto resize - if(!m_fixedSize) - resizeToText(); - else if(!m_rect.isValid()) { + if(!m_fixedSize && !m_rect.isValid()) { Size textSize = m_font->calculateTextRectSize(m_text); if(m_rect.width() <= 0) m_rect.setWidth(textSize.width()); diff --git a/src/framework/util/tools.h b/src/framework/util/tools.h index a6dc5aa0..0ff8885d 100644 --- a/src/framework/util/tools.h +++ b/src/framework/util/tools.h @@ -7,6 +7,7 @@ #include #include #include +#include "types.h" namespace fw { @@ -227,6 +228,12 @@ inline unsigned int hex2dec(const std::string& str) { return num; } +inline std::string ip2str(uint32 ip) { + char host[16]; + sprintf(host, "%d.%d.%d.%d", (uint8)ip, (uint8)(ip >> 8), (uint8)(ip >> 16), (uint8)(ip >> 24)); + return std::string(host); +} + // an empty string to use anywhere needed const static std::string empty_string; diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index f0917e0a..ca63cc2d 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -15,10 +15,10 @@ void Game::terminate() logout(); } -void Game::loginWorld(const std::string& account, const std::string& password, uint32 worldIp, uint16 worldPort, const std::string& characterName) +void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldHost, int worldPort, const std::string& characterName) { m_protocolGame = ProtocolGamePtr(new ProtocolGame); - m_protocolGame->login(account, password, worldIp, worldPort, characterName); + m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName); } void Game::logout() diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 6a9a670d..dc5953a5 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -12,7 +12,7 @@ public: void loginWorld(const std::string& account, const std::string& password, - uint32 worldIp, uint16 worldPort, + const std::string& worldHost, int worldPort, const std::string& characterName); void logout(); diff --git a/src/otclient/net/protocolgame.cpp b/src/otclient/net/protocolgame.cpp index b6d9bd32..664cf044 100644 --- a/src/otclient/net/protocolgame.cpp +++ b/src/otclient/net/protocolgame.cpp @@ -6,7 +6,7 @@ ProtocolGame::ProtocolGame() m_waitingLoginPacket = false; } -void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, uint32 ip, uint16 port, const std::string& characterName) +void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName) { if(accountName.empty() || accountPassword.empty()) { callLuaField("onError", "You must enter an account name and password."); @@ -18,9 +18,6 @@ void ProtocolGame::login(const std::string& accountName, const std::string& acco m_accountPassword = accountPassword; m_characterName = characterName; - char host[16]; - sprintf(host, "%d.%d.%d.%d", (uint8)ip, (uint8)(ip >> 8), (uint8)(ip >> 16), (uint8)(ip >> 24)); - connect(host, port); } diff --git a/src/otclient/net/protocolgame.h b/src/otclient/net/protocolgame.h index 4b1a1268..5f3fea64 100644 --- a/src/otclient/net/protocolgame.h +++ b/src/otclient/net/protocolgame.h @@ -13,7 +13,7 @@ public: ProtocolGame(); public: - void login(const std::string& accountName, const std::string& accountPassword, uint32 ip, uint16 port, const std::string& characterName); + void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName); void onConnect(); void onRecv(InputMessage& inputMessage); diff --git a/src/otclient/net/protocollogin.cpp b/src/otclient/net/protocollogin.cpp index 2f40e69c..7394d138 100644 --- a/src/otclient/net/protocollogin.cpp +++ b/src/otclient/net/protocollogin.cpp @@ -112,18 +112,19 @@ void ProtocolLogin::parseMOTD(InputMessage& inputMessage) void ProtocolLogin::parseCharacterList(InputMessage& inputMessage) { - uint8 characters = inputMessage.getU8(); - for(int i = 0; i < characters; ++i) { + typedef std::tuple CharacterInfo; + typedef std::vector CharaterList; + CharaterList charList; + + int numCharacters = inputMessage.getU8(); + for(int i = 0; i < numCharacters; ++i) { std::string name = inputMessage.getString(); std::string world = inputMessage.getString(); uint32 ip = inputMessage.getU32(); uint16 port = inputMessage.getU16(); - - // TODO just test - if(i == 0) { - g_game.loginWorld(m_accountName, m_accountPassword, ip, port, name); - break; - } + charList.push_back(CharacterInfo(name, world, fw::ip2str(ip), port)); } - /*uint16 premiumDays =*/ inputMessage.getU16(); + int premDays = inputMessage.getU16(); + + callLuaField("onCharacterList", charList, premDays); } diff --git a/src/otclient/otclientluafunctions.cpp b/src/otclient/otclientluafunctions.cpp index 01921c6c..ba91480b 100644 --- a/src/otclient/otclientluafunctions.cpp +++ b/src/otclient/otclientluafunctions.cpp @@ -1,6 +1,7 @@ #include "otclient.h" #include +#include #include #include #include @@ -19,4 +20,7 @@ void OTClient::registerLuaFunctions() g_lua.bindClassMemberFunction("cancelLogin", &ProtocolLogin::cancelLogin); g_lua.registerClass(); + + g_lua.registerClass(); + g_lua.bindClassStaticFunction("loginWorld", std::bind(&Game::loginWorld, &g_game, _1, _2, _3, _4, _5)); }