Show game started info in server screen with icon

This commit is contained in:
Benau 2018-08-28 14:43:48 +08:00
parent ca9f66a8a8
commit 8fc2bdcc3f
14 changed files with 73 additions and 14 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -17,6 +17,10 @@
<spacer width="10"/>
<label proportion="1" height="100%" text_align="left"
I18N="In the server selection screen" text="Show only private server(s)"/>
<checkbox width="fit" id="game_started" text_align="left"/>
<spacer width="10"/>
<label proportion="1" height="100%" text_align="left"
I18N="In the server selection screen" text="Hide server(s) which has already begun a game"/>
</div>
</div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1187,7 +1187,7 @@ int handleCmdLine()
NetworkConfig::get()->setIsWAN();
NetworkConfig::get()->setIsServer(false);
auto server = std::make_shared<Server>(0, L"", 0, 0, 0, 0, server_addr,
!server_password.empty());
!server_password.empty(), false);
NetworkConfig::get()->addNetworkPlayer(
input_manager->getDeviceManager()->getLatestUsedDevice(),
PlayerManager::getCurrentPlayer(), PLAYER_DIFFICULTY_NORMAL);

View File

@ -956,7 +956,7 @@ void ServerLobby::checkIncomingConnectionRequests()
const TransportAddress &addr = STKHost::get()->getPublicAddress();
request->addParameter("address", addr.getIP() );
request->addParameter("port", addr.getPort());
request->addParameter("current_players", m_game_setup->getPlayerCount());
request->addParameter("current-players", m_game_setup->getPlayerCount());
request->queue();
} // checkIncomingConnectionRequests

View File

@ -60,6 +60,7 @@ Server::Server(const XMLNode& xml) : m_supports_encrytion(true)
m_address.setPort(port);
xml.get("private_port", &m_private_port);
xml.get("password", &m_password_protected);
xml.get("game_started", &m_game_started);
xml.get("distance", &m_distance);
m_server_owner_name = L"-";
m_server_owner_lower_case_name = "-";
@ -118,10 +119,12 @@ Server::Server(const XMLNode& xml) : m_supports_encrytion(true)
* \param server_mode The game modes of server (including minor and major).
* \param address IP and port of the server.
* \param password_protected True if can only be joined with a password.
* \param game_started True if there is already game begun in server.
*/
Server::Server(unsigned server_id, const core::stringw &name, int max_players,
int current_players, unsigned difficulty, unsigned server_mode,
const TransportAddress &address, bool password_protected)
const TransportAddress &address, bool password_protected,
bool game_started)
: m_supports_encrytion(false)
{
m_name = name;
@ -138,6 +141,7 @@ Server::Server(unsigned server_id, const core::stringw &name, int max_players,
m_password_protected = password_protected;
m_distance = 0.0f;
m_official = false;
m_game_started = game_started;
} // server(server_id, ...)
// ----------------------------------------------------------------------------

View File

@ -84,6 +84,8 @@ protected:
bool m_official;
bool m_supports_encrytion;
bool m_game_started;
public:
/** Initialises the object from an XML node. */
@ -91,7 +93,7 @@ public:
Server(unsigned server_id, const irr::core::stringw &name,
int max_players, int current_players, unsigned difficulty,
unsigned server_mode, const TransportAddress &address,
bool password_protected);
bool password_protected, bool game_started);
bool filterByWords(const irr::core::stringw words) const;
// ------------------------------------------------------------------------
/** Returns ip address and port of this server. */
@ -134,6 +136,7 @@ public:
bool supportsEncryption() const { return m_supports_encrytion; }
// ------------------------------------------------------------------------
bool isOfficial() const { return m_official; }
// ------------------------------------------------------------------------
bool isGameStarted() const { return m_game_started; }
}; // Server
#endif // HEADER_SERVER_HPP

View File

@ -193,10 +193,11 @@ Online::XMLRequest* ServersManager::getLANRefreshRequest() const
uint8_t mode = s.getUInt8();
sender.setPort(port);
uint8_t password = s.getUInt8();
uint8_t game_started = s.getUInt8();
servers_now.insert(std::make_pair(name,
std::make_shared<Server>(cur_server_id++, name,
max_players, players, difficulty, mode, sender,
password == 1)));
password == 1, game_started == 1)));
//all_servers.[name] = servers_now.back();
} // if received_data
} // while still waiting

View File

@ -1031,6 +1031,7 @@ void STKHost::handleDirectSocketRequest(Network* direct_socket,
s.addUInt8((uint8_t)race_manager->getDifficulty());
s.addUInt8((uint8_t)NetworkConfig::get()->getServerMode());
s.addUInt8(!NetworkConfig::get()->getPassword().empty());
s.addUInt8(0);
direct_socket->sendRawPacket(s, sender);
} // if message is server-requested
else if (command == connection_cmd)

View File

@ -267,7 +267,7 @@ void CreateServerScreen::createServer()
auto server = std::make_shared<Server>(0/*server_id*/, name,
max_players, /*current_player*/0, (RaceManager::Difficulty)
difficulty_widget->getSelection(PLAYER_ID_GAME_MASTER),
0, server_address, !password.empty());
0, server_address, !password.empty(), false);
#undef USE_GRAPHICS_SERVER
#ifdef USE_GRAPHICS_SERVER

View File

@ -261,7 +261,7 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name,
NetworkConfig::get()->setIsServer(false);
NetworkConfig::get()->setPassword("");
auto server = std::make_shared<Server>(0, L"", 0, 0, 0, 0,
server_addr, false);
server_addr, false, false);
STKHost::create();
auto cts = std::make_shared<ConnectToServer>(server);
cts->setup();

View File

@ -18,10 +18,13 @@
#include "states_screens/server_selection.hpp"
#include "audio/sfx_manager.hpp"
#include "graphics/irr_driver.hpp"
#include "guiengine/CGUISpriteBank.hpp"
#include "guiengine/widgets/check_box_widget.hpp"
#include "guiengine/widgets/icon_button_widget.hpp"
#include "guiengine/widgets/label_widget.hpp"
#include "guiengine/modaldialog.hpp"
#include "io/file_manager.hpp"
#include "network/network_config.hpp"
#include "network/server.hpp"
#include "network/servers_manager.hpp"
@ -92,6 +95,16 @@ void ServerSelection::loadedFromFile()
m_private_server = getWidget<GUIEngine::CheckBoxWidget>("private_server");
assert(m_private_server != NULL);
m_private_server->setState(false);
m_game_started = getWidget<GUIEngine::CheckBoxWidget>("game_started");
assert(m_game_started != NULL);
m_game_started->setState(false);
m_icon_bank = new irr::gui::STKModifiedSpriteBank(GUIEngine::getGUIEnv());
video::ITexture* icon1 = irr_driver->getTexture(
file_manager->getAsset(FileManager::GUI, "green_check.png"));
video::ITexture* icon2 = irr_driver->getTexture(
file_manager->getAsset(FileManager::GUI, "hourglass.png"));
m_icon_bank->addTextureAsSprite(icon1);
m_icon_bank->addTextureAsSprite(icon2);
} // loadedFromFile
// ----------------------------------------------------------------------------
@ -120,6 +133,8 @@ void ServerSelection::beforeAddingWidget()
void ServerSelection::init()
{
Screen::init();
m_icon_bank->setScale((float)getHeight() / 20.0f / 128.0f);
m_server_list_widget->setIcons(m_icon_bank);
m_sort_desc = false;
/** Triggers the loading of the server list in the servers manager. */
refresh(true);
@ -164,19 +179,23 @@ void ServerSelection::loadList(unsigned sort_case)
assert(false);
return false;
});
for (auto server : m_servers)
for (auto& server : m_servers)
{
const int icon = server->isGameStarted() ? 1 : 0;
core::stringw num_players;
num_players.append(StringUtils::toWString(server->getCurrentPlayers()));
num_players.append("/");
num_players.append(StringUtils::toWString(server->getMaxPlayers()));
std::vector<GUIEngine::ListWidget::ListCell> row;
row.push_back(GUIEngine::ListWidget::ListCell(server->getName(), -1, 3));
row.push_back(GUIEngine::ListWidget::ListCell(num_players, -1, 1, true));
row.push_back(GUIEngine::ListWidget::ListCell(server->getName(), icon,
3));
row.push_back(GUIEngine::ListWidget::ListCell(num_players, -1, 1,
true));
core::stringw difficulty =
race_manager->getDifficultyName(server->getDifficulty());
row.push_back(GUIEngine::ListWidget::ListCell(difficulty, -1, 1, true));
row.push_back(GUIEngine::ListWidget::ListCell(difficulty, -1, 1,
true));
core::stringw mode =
NetworkConfig::get()->getModeName(server->getServerMode());
@ -228,7 +247,7 @@ void ServerSelection::eventCallback(GUIEngine::Widget* widget,
{
refresh(true);
}
else if (name == "private_server")
else if (name == "private_server" || name == "game_started")
{
copyFromServersManager();
}
@ -313,9 +332,23 @@ void ServerSelection::copyFromServersManager()
if (m_servers.empty())
return;
m_servers.erase(std::remove_if(m_servers.begin(), m_servers.end(),
[this](const std::shared_ptr<Server> a)->bool
[this](const std::shared_ptr<Server>& a)->bool
{
return a->isPasswordProtected() != m_private_server->getState();
}), m_servers.end());
m_servers.erase(std::remove_if(m_servers.begin(), m_servers.end(),
[this](const std::shared_ptr<Server>& a)->bool
{
if (m_game_started->getState() && a->isGameStarted())
return true;
return false;
}), m_servers.end());
loadList(/* distance */ 5);
} // copyFromServersManager
// ----------------------------------------------------------------------------
void ServerSelection::unloaded()
{
delete m_icon_bank;
m_icon_bank = NULL;
} // unloaded

View File

@ -32,6 +32,15 @@ namespace GUIEngine
class LabelWidget;
class ListWidget;
}
namespace irr
{
namespace gui
{
class STKModifiedSpriteBank;
}
}
class Server;
/**
@ -51,9 +60,11 @@ private:
std::vector<std::shared_ptr<Server> > m_servers;
GUIEngine::CheckBoxWidget* m_private_server;
GUIEngine::CheckBoxWidget* m_game_started;
GUIEngine::IconButtonWidget* m_reload_widget;
GUIEngine::LabelWidget* m_update_status;
GUIEngine::ListWidget* m_server_list_widget;
irr::gui::STKModifiedSpriteBank* m_icon_bank;
/** \brief To check (and set) if sort order is descending **/
bool m_sort_desc;
@ -86,6 +97,8 @@ public:
virtual void tearDown() OVERRIDE;
virtual void unloaded() OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void onUpdate(float dt) OVERRIDE;