Started to support LAN servers in the GUI (wip).

This commit is contained in:
hiker 2015-10-10 12:13:32 +11:00
parent 612ec37dbd
commit f0c04a8bef
10 changed files with 115 additions and 49 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<stkgui> <stkgui>
<div x="0" y="0" width="100%" height="100%" layout="vertical-row" > <div x="0" y="0" width="100%" height="100%" layout="vertical-row" >
<header text_align="center" width="80%" align="center" I18N="In the server creation screen" text="Server Creation"/> <header id="title" text_align="center" width="80%" align="center" I18N="In the server creation screen" text="Server Creation"/>
<spacer height="15" width="10"/> <spacer height="15" width="10"/>
<box proportion="4" width="90%" layout="vertical-row" align="center"> <box proportion="4" width="90%" layout="vertical-row" align="center">
<div width="90%" align="center" layout="vertical-row" y="2%" height="96%"> <div width="90%" align="center" layout="vertical-row" y="2%" height="96%">

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<stkgui> <stkgui>
<div x="0" y="0" width="100%" height="fit" layout="vertical-row">
<button id="user-id" width="20%" height="fit" align="right"/>
</div>
<div x="2%" y="2%" width="96%" height="96%" layout="vertical-row" > <div x="2%" y="2%" width="96%" height="96%" layout="vertical-row" >
<header text_align="center" width="80%" align="center" I18N="In the online multiplayer screen" text="Online Multiplayer"/> <header text_align="center" width="80%" align="center" I18N="In the online multiplayer screen" text="Online Multiplayer"/>
@ -17,7 +21,7 @@
I18N="In the online multiplayer screen" text="Create Server"/> I18N="In the online multiplayer screen" text="Create Server"/>
<icon-button id="manage_user" width="128" height="128" <icon-button id="manage_user" width="128" height="128"
icon="gui/options_players.png" icon="gui/options_players.png"
I18N="In the online multiplayer screen" text="Local Users"/> I18N="In the online multiplayer screen" text="Users"/>
</buttonbar> </buttonbar>
</box> </box>

View File

@ -28,7 +28,7 @@ namespace Online
{ {
Server::SortOrder Server::m_sort_order = Server::SO_NAME; Server::SortOrder Server::m_sort_order = Server::SO_NAME;
Server::Server(const XMLNode & xml) Server::Server(const XMLNode & xml, bool is_lan)
{ {
assert(xml.getName() == "server"); assert(xml.getName() == "server");
@ -37,6 +37,7 @@ namespace Online
m_server_id = 0; m_server_id = 0;
m_current_players = 0; m_current_players = 0;
m_max_players = 0; m_max_players = 0;
m_is_lan = is_lan;
xml.get("name", &m_lower_case_name); xml.get("name", &m_lower_case_name);
m_name = StringUtils::xmlDecode(m_lower_case_name); m_name = StringUtils::xmlDecode(m_lower_case_name);
@ -49,6 +50,18 @@ namespace Online
} // Server(const XML&) } // Server(const XML&)
// ----------------------------------------------------------------------------
Server::Server(const core::stringw &name, bool is_lan, int max_players,
int current_players)
{
m_name = name;
m_satisfaction_score = 0;
m_server_id = 0;
m_current_players = current_players;
m_max_players = max_players;
m_is_lan = is_lan;
} // server(name, ...)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** /**
* \brief Filter the add-on with a list of words. * \brief Filter the add-on with a list of words.

View File

@ -65,6 +65,9 @@ namespace Online
/** The score/rating given */ /** The score/rating given */
float m_satisfaction_score; float m_satisfaction_score;
/** True if this server is on the LAN, false otherwise. */
bool m_is_lan;
/** The sort order to be used in the comparison. */ /** The sort order to be used in the comparison. */
static SortOrder m_sort_order; static SortOrder m_sort_order;
@ -73,8 +76,9 @@ namespace Online
public: public:
/** Initialises the object from an XML node. */ /** Initialises the object from an XML node. */
Server(const XMLNode & xml); Server(const XMLNode &xml, bool is_lan);
Server(const core::stringw &name, bool is_lan, int max_players,
int current_players);
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** Sets the sort order used in the comparison function. It is static, so /** Sets the sort order used in the comparison function. It is static, so
* that each instance can access the sort order. */ * that each instance can access the sort order. */

View File

@ -90,6 +90,10 @@ namespace Online
} // refreshRequest } // refreshRequest
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
/** Callback from the refresh request.
* \param success If the refresh was successful.
* \param input The XML data describing the server.
*/
void ServersManager::refresh(bool success, const XMLNode *input) void ServersManager::refresh(bool success, const XMLNode *input)
{ {
if (!success) if (!success)
@ -102,7 +106,7 @@ namespace Online
cleanUpServers(); cleanUpServers();
for (unsigned int i = 0; i < servers_xml->getNumNodes(); i++) for (unsigned int i = 0; i < servers_xml->getNumNodes(); i++)
{ {
addServer(new Server(*servers_xml->getNode(i))); addServer(new Server(*servers_xml->getNode(i), /*is_lan*/false));
} }
m_last_load_time.setAtomic((float)StkTime::getRealTime()); m_last_load_time.setAtomic((float)StkTime::getRealTime());
} // refresh } // refresh

View File

@ -47,6 +47,7 @@ DEFINE_SCREEN_SINGLETON( CreateServerScreen );
CreateServerScreen::CreateServerScreen() : Screen("online/create_server.stkgui") CreateServerScreen::CreateServerScreen() : Screen("online/create_server.stkgui")
{ {
m_server_creation_request = NULL; m_server_creation_request = NULL;
m_is_lan = false;
} // CreateServerScreen } // CreateServerScreen
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -89,7 +90,12 @@ void CreateServerScreen::init()
setInitialFocus(); setInitialFocus();
DemoWorld::resetIdleTime(); DemoWorld::resetIdleTime();
m_info_widget->setText("", false); m_info_widget->setText("", false);
} LabelWidget *title = getWidget<LabelWidget>("title");
title->setText(m_is_lan ? _("Create LAN Server")
: _("Create Server") , false);
} // init
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CreateServerScreen::onUpdate(float delta) void CreateServerScreen::onUpdate(float delta)
{ {
@ -99,7 +105,8 @@ void CreateServerScreen::onUpdate(float delta)
{ {
if(m_server_creation_request->isSuccess()) if(m_server_creation_request->isSuccess())
{ {
new ServerInfoDialog(m_server_creation_request->getCreatedServerID(), true); new ServerInfoDialog(m_server_creation_request->getCreatedServerID(),
true);
} }
else else
{ {
@ -124,22 +131,36 @@ void CreateServerScreen::onUpdate(float delta)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CreateServerScreen::serverCreationRequest() void CreateServerScreen::serverCreationRequest()
{ {
if (m_is_lan)
{
const irr::core::stringw name = m_name_widget->getText().trim();
const int max_players = m_max_players_widget->getValue();
Server *server = new Server(name, /*lan*/true, max_players,
/*current_player*/1);
ServersManager::get()->addServer(server);
return;
}
// Now must be WAN: forward request to the stk server
const irr::core::stringw name = m_name_widget->getText().trim(); const irr::core::stringw name = m_name_widget->getText().trim();
const int max_players = m_max_players_widget->getValue(); const int max_players = m_max_players_widget->getValue();
m_info_widget->setErrorColor(); m_info_widget->setErrorColor();
if (name.size() < 4 || name.size() > 30) if (name.size() < 4 || name.size() > 30)
{ {
m_info_widget->setText(_("Name has to be between 4 and 30 characters long!"), false); m_info_widget->setText(
_("Name has to be between 4 and 30 characters long!"), false);
} }
else if (max_players < 2 || max_players > 12) else if (max_players < 2 || max_players > 12)
{ {
m_info_widget->setText(_("The maxinum number of players has to be between 2 and 12."), false); m_info_widget->setText(
_("The maxinum number of players has to be between 2 and 12."), false);
} }
else else
{ {
m_server_creation_request = new ServerCreationRequest(); m_server_creation_request = new ServerCreationRequest();
PlayerManager::setUserDetails(m_server_creation_request, "create", Online::API::SERVER_PATH); PlayerManager::setUserDetails(m_server_creation_request, "create",
Online::API::SERVER_PATH);
m_server_creation_request->addParameter("name", name); m_server_creation_request->addParameter("name", name);
m_server_creation_request->addParameter("max_players", max_players); m_server_creation_request->addParameter("max_players", max_players);
m_server_creation_request->queue(); m_server_creation_request->queue();
@ -147,13 +168,18 @@ void CreateServerScreen::serverCreationRequest()
return; return;
} }
SFXManager::get()->quickSound("anvil"); SFXManager::get()->quickSound("anvil");
} } // serverCreationRequest
// --------------------------------------------------------------------
// ----------------------------------------------------------------------------
/** Callbacks from the online create server request.
*/
void CreateServerScreen::ServerCreationRequest::callback() void CreateServerScreen::ServerCreationRequest::callback()
{ {
if (isSuccess()) if (isSuccess())
{ {
Server *server = new Server(*getXMLData()->getNode("server")); // Must be a LAN server
Server *server = new Server(*getXMLData()->getNode("server"),
/*is lan*/false);
ServersManager::get()->addServer(server); ServersManager::get()->addServer(server);
m_created_server_id = server->getServerId(); m_created_server_id = server->getServerId();
} // isSuccess } // isSuccess
@ -165,7 +191,8 @@ void CreateServerScreen::eventCallback(Widget* widget, const std::string& name,
{ {
if (name == m_options_widget->m_properties[PROP_ID]) if (name == m_options_widget->m_properties[PROP_ID])
{ {
const std::string& selection = m_options_widget->getSelectionIDString(PLAYER_ID_GAME_MASTER); const std::string& selection =
m_options_widget->getSelectionIDString(PLAYER_ID_GAME_MASTER);
if (selection == m_cancel_widget->m_properties[PROP_ID]) if (selection == m_cancel_widget->m_properties[PROP_ID])
{ {
StateManager::get()->escapePressed(); StateManager::get()->escapePressed();
@ -173,7 +200,7 @@ void CreateServerScreen::eventCallback(Widget* widget, const std::string& name,
else if (selection == m_create_widget->m_properties[PROP_ID]) else if (selection == m_create_widget->m_properties[PROP_ID])
{ {
serverCreationRequest(); serverCreationRequest();
} } // is create_widget
} }
} // eventCallback } // eventCallback

View File

@ -35,6 +35,9 @@ class CreateServerScreen : public GUIEngine::Screen,
private: private:
friend class GUIEngine::ScreenSingleton<CreateServerScreen>; friend class GUIEngine::ScreenSingleton<CreateServerScreen>;
/** */
bool m_is_lan;
CreateServerScreen(); CreateServerScreen();
GUIEngine::TextBoxWidget * m_name_widget; GUIEngine::TextBoxWidget * m_name_widget;
@ -93,6 +96,10 @@ public:
/** \brief Implements the callback when a dialog gets closed. */ /** \brief Implements the callback when a dialog gets closed. */
virtual void onDialogClose() OVERRIDE; virtual void onDialogClose() OVERRIDE;
};
// ------------------------------------------------------------------------
/** Sets if a lan or wan server is to be created. */
void setIsLan(bool is_lan) { m_is_lan = is_lan; }
}; // class CreateServerScreen
#endif #endif

View File

@ -67,6 +67,9 @@ OnlineScreen::~OnlineScreen()
void OnlineScreen::loadedFromFile() void OnlineScreen::loadedFromFile()
{ {
m_user_id = getWidget<ButtonWidget>("user-id");
assert(m_user_id);
m_back_widget = getWidget<IconButtonWidget>("back"); m_back_widget = getWidget<IconButtonWidget>("back");
assert(m_back_widget != NULL); assert(m_back_widget != NULL);
@ -87,9 +90,6 @@ void OnlineScreen::loadedFromFile()
m_quick_wan_play_widget = getWidget<IconButtonWidget>("quick_wan_play"); m_quick_wan_play_widget = getWidget<IconButtonWidget>("quick_wan_play");
assert(m_quick_wan_play_widget != NULL); assert(m_quick_wan_play_widget != NULL);
m_online_status_widget = getWidget<LabelWidget>("online_status");
assert(m_online_status_widget != NULL);
m_bottom_menu_widget = getWidget<RibbonWidget>("menu_bottomrow"); m_bottom_menu_widget = getWidget<RibbonWidget>("menu_bottomrow");
assert(m_bottom_menu_widget != NULL); assert(m_bottom_menu_widget != NULL);
m_profile_widget = getWidget<IconButtonWidget>("profile"); m_profile_widget = getWidget<IconButtonWidget>("profile");
@ -152,30 +152,28 @@ void OnlineScreen::init()
Screen::init(); Screen::init();
setInitialFocus(); setInitialFocus();
DemoWorld::resetIdleTime(); DemoWorld::resetIdleTime();
core::stringw m = _("Logged in as: %s.",
PlayerManager::getCurrentOnlineUserName());
m_online_status_widget->setText(m, false);
} // init } // init
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void OnlineScreen::onUpdate(float delta) void OnlineScreen::onUpdate(float delta)
{ {
PlayerProfile *player = PlayerManager::getCurrentPlayer();
if (PlayerManager::getCurrentOnlineState() == PlayerProfile::OS_SIGNED_IN)
{
m_user_id->setText(player->getLastOnlineName() + "@stk");
}
else
{
m_user_id->setText(player->getName());
}
if (hasStateChanged()) if (hasStateChanged())
{ {
GUIEngine::reshowCurrentScreen(); GUIEngine::reshowCurrentScreen();
return; return;
} }
if (m_recorded_state == PlayerProfile::OS_SIGNING_IN)
{
m_online_status_widget->setText(StringUtils::loadingDots(_("Logging in")),
false );
}
else if (m_recorded_state == PlayerProfile::OS_SIGNING_OUT)
{
m_online_status_widget->setText(StringUtils::loadingDots(_("Logging out")),
false );
}
} // onUpdate } // onUpdate
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -249,10 +247,13 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
} }
else if (selection == m_create_lan_server_widget->m_properties[PROP_ID]) else if (selection == m_create_lan_server_widget->m_properties[PROP_ID])
{ {
CreateServerScreen::getInstance()->setIsLan(true);
CreateServerScreen::getInstance()->push();
// TODO: create lan server // TODO: create lan server
} }
else if (selection == m_find_lan_server_widget->m_properties[PROP_ID]) else if (selection == m_find_lan_server_widget->m_properties[PROP_ID])
{ {
ServerSelection::getInstance()->push();
// TODO: find lan server; // TODO: find lan server;
} }
else if (selection == m_manage_user->m_properties[PROP_ID]) else if (selection == m_manage_user->m_properties[PROP_ID])
@ -270,6 +271,7 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
} }
else if (selection == m_create_wan_server_widget->m_properties[PROP_ID]) else if (selection == m_create_wan_server_widget->m_properties[PROP_ID])
{ {
CreateServerScreen::getInstance()->setIsLan(false);
CreateServerScreen::getInstance()->push(); CreateServerScreen::getInstance()->push();
} }
else if (selection == m_quick_wan_play_widget->m_properties[PROP_ID]) else if (selection == m_quick_wan_play_widget->m_properties[PROP_ID])

View File

@ -25,7 +25,7 @@
#include "guiengine/widgets/icon_button_widget.hpp" #include "guiengine/widgets/icon_button_widget.hpp"
#include "utils/ptr_vector.hpp" #include "utils/ptr_vector.hpp"
namespace GUIEngine { class Widget; class ListWidget; } namespace GUIEngine { class Widget; class ListWidget; class ButtonWidget; }
/** /**
* \brief Handles the main menu * \brief Handles the main menu
@ -51,13 +51,14 @@ private:
GUIEngine::IconButtonWidget *m_create_wan_server_widget; GUIEngine::IconButtonWidget *m_create_wan_server_widget;
GUIEngine::IconButtonWidget *m_quick_wan_play_widget; GUIEngine::IconButtonWidget *m_quick_wan_play_widget;
GUIEngine::LabelWidget * m_online_status_widget;
GUIEngine::RibbonWidget *m_bottom_menu_widget; GUIEngine::RibbonWidget *m_bottom_menu_widget;
GUIEngine::IconButtonWidget *m_register_widget; GUIEngine::IconButtonWidget *m_register_widget;
GUIEngine::IconButtonWidget *m_profile_widget; GUIEngine::IconButtonWidget *m_profile_widget;
GUIEngine::IconButtonWidget *m_sign_out_widget; GUIEngine::IconButtonWidget *m_sign_out_widget;
/** Keep the widget to to the user name. */
GUIEngine::ButtonWidget *m_user_id;
PlayerProfile::OnlineState m_recorded_state; PlayerProfile::OnlineState m_recorded_state;
bool hasStateChanged(); bool hasStateChanged();

View File

@ -48,6 +48,10 @@ private:
const Online::ServersManager::RefreshRequest *m_refresh_request; const Online::ServersManager::RefreshRequest *m_refresh_request;
bool m_fake_refresh; bool m_fake_refresh;
/** True if only lan servers should be shown. */
bool m_is_lan;
void refresh(); void refresh();
public: public: