basic charlist
This commit is contained in:
parent
b58a1aa7d4
commit
c60b677baa
|
@ -1,5 +1,5 @@
|
|||
TextList < UIWidget
|
||||
size: 200 200
|
||||
layout: verticalBox
|
||||
border-image:
|
||||
source: /core_ui/images/panel_flat.png
|
||||
border: 4
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -42,6 +42,7 @@ void LuaInterface::registerFunctions()
|
|||
g_lua.bindClassMemberFunction<UIWidget>("getChildById", &UIWidget::getChildById);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getChildByIndex", &UIWidget::getChildByIndex);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getChildCount", &UIWidget::getChildCount);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getFocusedChild", &UIWidget::getFocusedChild);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("insertChild", &UIWidget::insertChild);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("removeChild", &UIWidget::removeChild);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("addChild", &UIWidget::addChild);
|
||||
|
|
|
@ -76,6 +76,13 @@ template<typename Ret, typename... Args>
|
|||
typename std::enable_if<!std::is_void<Ret>::value, bool>::type
|
||||
luavalue_cast(int index, std::function<Ret(Args...)>& func);
|
||||
|
||||
// vector
|
||||
template<typename T>
|
||||
void push_luavalue(const std::vector<T>& vec);
|
||||
|
||||
// tuple
|
||||
template<typename... Args>
|
||||
void push_luavalue(const std::tuple<Args...>& tuple);
|
||||
|
||||
// start definitions
|
||||
|
||||
|
@ -181,4 +188,38 @@ luavalue_cast(int index, std::function<Ret(Args...)>& func) {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
void push_luavalue(const std::vector<T>& vec) {
|
||||
g_lua.newTable();
|
||||
int i = 1;
|
||||
for(const T& v : vec) {
|
||||
push_luavalue(v);
|
||||
g_lua.rawSeti(i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
template<int N>
|
||||
struct push_tuple_luavalue {
|
||||
template<typename Tuple>
|
||||
static void call(const Tuple& tuple) {
|
||||
push_luavalue(std::get<N-1>(tuple));
|
||||
g_lua.rawSeti(N);
|
||||
push_tuple_luavalue<N-1>::call(tuple);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct push_tuple_luavalue<0> {
|
||||
template<typename Tuple>
|
||||
static void call(const Tuple& tuple) { }
|
||||
};
|
||||
|
||||
template<typename... Args>
|
||||
void push_luavalue(const std::tuple<Args...>& tuple) {
|
||||
g_lua.newTable();
|
||||
push_tuple_luavalue<sizeof...(Args)>::call(tuple);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <sstream>
|
||||
#include <exception>
|
||||
#include <cxxabi.h>
|
||||
#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;
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<std::string, std::string, std::string, int> CharacterInfo;
|
||||
typedef std::vector<CharacterInfo> 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();
|
||||
charList.push_back(CharacterInfo(name, world, fw::ip2str(ip), port));
|
||||
}
|
||||
int premDays = inputMessage.getU16();
|
||||
|
||||
// TODO just test
|
||||
if(i == 0) {
|
||||
g_game.loginWorld(m_accountName, m_accountPassword, ip, port, name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*uint16 premiumDays =*/ inputMessage.getU16();
|
||||
callLuaField("onCharacterList", charList, premDays);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "otclient.h"
|
||||
|
||||
#include <framework/luascript/luainterface.h>
|
||||
#include <otclient/core/game.h>
|
||||
#include <otclient/core/datmanager.h>
|
||||
#include <otclient/core/spritemanager.h>
|
||||
#include <otclient/net/protocollogin.h>
|
||||
|
@ -19,4 +20,7 @@ void OTClient::registerLuaFunctions()
|
|||
g_lua.bindClassMemberFunction("cancelLogin", &ProtocolLogin::cancelLogin);
|
||||
|
||||
g_lua.registerClass<ProtocolGame, Protocol>();
|
||||
|
||||
g_lua.registerClass<Game>();
|
||||
g_lua.bindClassStaticFunction<Game>("loginWorld", std::bind(&Game::loginWorld, &g_game, _1, _2, _3, _4, _5));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue