diff --git a/data/gui/online/networking_lobby.stkgui b/data/gui/online/networking_lobby.stkgui index c2660c79c..c97df606f 100644 --- a/data/gui/online/networking_lobby.stkgui +++ b/data/gui/online/networking_lobby.stkgui @@ -20,7 +20,7 @@ <box proportion="2" height="100%" layout="vertical-row"> <textbox id="chat" width="100%" height="30%"/> <spacer height="20"/> - <button id="send_text" height="30%" width="fit" I18N="In the network lobby" text="Send text" /> + <button id="send_text" height="30%" width="fit" I18N="In the network lobby" text="Send" /> </box> <spacer width="40"/> <buttonbar id="actions" proportion="1" width="75%" height="75%"> diff --git a/src/network/network_player_profile.hpp b/src/network/network_player_profile.hpp index 65522b24c..f85884a70 100644 --- a/src/network/network_player_profile.hpp +++ b/src/network/network_player_profile.hpp @@ -118,11 +118,9 @@ public: // ------------------------------------------------------------------------ uint32_t getOnlineID() const { return m_online_id; } // ------------------------------------------------------------------------ - std::shared_ptr<STKPeer> getPeer() const { return m_peer.lock(); } + bool isOfflineAccount() const { return m_online_id == 0; } // ------------------------------------------------------------------------ - /** Returns the minimun info for networking lobby screen. */ - std::tuple<uint32_t, uint32_t, irr::core::stringw> toTuple() const - { return std::make_tuple(m_host_id, m_online_id, m_player_name); } + std::shared_ptr<STKPeer> getPeer() const { return m_peer.lock(); } }; // class NetworkPlayerProfile diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index 208630358..e539cb2d9 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -269,7 +269,7 @@ bool ClientLobby::notifyEventAsynchronous(Event* event) case LE_VOTE_TRACK: playerTrackVote(event); break; case LE_VOTE_REVERSE: playerReversedVote(event); break; case LE_VOTE_LAPS: playerLapsVote(event); break; - case LE_AUTHORISED: becomingServerOwner(); break; + case LE_SERVER_OWNERSHIP: becomingServerOwner(); break; } // switch return true; @@ -454,18 +454,21 @@ void ClientLobby::connectionAccepted(Event* event) void ClientLobby::updatePlayerList(Event* event) { if (!checkDataSize(event, 1)) return; - NetworkString &data = event->data(); + NetworkString& data = event->data(); unsigned player_count = data.getUInt8(); - NetworkingLobby::getInstance()->cleanPlayers(); + std::vector<std::tuple<uint32_t, uint32_t, core::stringw, int> > players; for (unsigned i = 0; i < player_count; i++) { - std::tuple<uint32_t, uint32_t, core::stringw, bool> pl; + std::tuple<uint32_t, uint32_t, core::stringw, int> pl; std::get<0>(pl) = data.getUInt32(); std::get<1>(pl) = data.getUInt32(); data.decodeStringW(&std::get<2>(pl)); - std::get<3>(pl) = data.getUInt8() == 1; - NetworkingLobby::getInstance()->addPlayer(pl); + // icon to be used, see NetworkingLobby::loadedFromFile + std::get<3>(pl) = data.getUInt8() == 1 /*if server owner*/ ? 0 : + std::get<1>(pl) != 0 /*if online account*/ ? 1 : 2; + players.push_back(pl); } + NetworkingLobby::getInstance()->updatePlayers(players); } // updatePlayerList //----------------------------------------------------------------------------- diff --git a/src/network/protocols/lobby_protocol.hpp b/src/network/protocols/lobby_protocol.hpp index ec75ac45d..8f90036da 100644 --- a/src/network/protocols/lobby_protocol.hpp +++ b/src/network/protocols/lobby_protocol.hpp @@ -62,7 +62,7 @@ public: LE_VOTE_LAPS, // vote number of laps LE_CHAT, LE_FINAL_PLAYER_LIST, - LE_AUTHORISED, + LE_SERVER_OWNERSHIP, LE_KICK_HOST }; diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index b5a0149aa..afb215fb6 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -166,6 +166,7 @@ void ServerLobby::kickHost(Event* event) if (m_server_owner.lock() != event->getPeerSP()) return; lock.unlock(); + if (!checkDataSize(event, 4)) return; NetworkString& data = event->data(); uint32_t host_id = data.getUInt32(); std::shared_ptr<STKPeer> peer = STKHost::get()->findPeerByHostId(host_id); @@ -872,7 +873,7 @@ void ServerLobby::updateServerOwner() if (owner) { NetworkString* ns = getNetworkString(); - ns->addUInt8(LE_AUTHORISED); + ns->addUInt8(LE_SERVER_OWNERSHIP); owner->sendPacket(ns); delete ns; m_server_owner = owner; diff --git a/src/states_screens/dialogs/network_user_dialog.cpp b/src/states_screens/dialogs/network_user_dialog.cpp index 2ccb247b3..cdec7f2a5 100644 --- a/src/states_screens/dialogs/network_user_dialog.cpp +++ b/src/states_screens/dialogs/network_user_dialog.cpp @@ -47,6 +47,7 @@ void NetworkUserDialog::beforeAddingWidgets() m_friend_widget = getWidget<IconButtonWidget>("friend"); assert(m_friend_widget != NULL); + m_friend_widget->setVisible(m_online_id != 0); m_kick_widget = getWidget<IconButtonWidget>("decline"); assert(m_kick_widget != NULL); diff --git a/src/states_screens/networking_lobby.cpp b/src/states_screens/networking_lobby.cpp index 92504380a..ea8c5bda8 100644 --- a/src/states_screens/networking_lobby.cpp +++ b/src/states_screens/networking_lobby.cpp @@ -15,16 +15,12 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#define DEBUG_MENU_ITEM 0 - #include "states_screens/networking_lobby.hpp" #include <string> -#include <iostream> -#include "challenges/unlock_manager.hpp" #include "config/player_manager.hpp" -#include "guiengine/widgets/bubble_widget.hpp" +#include "guiengine/CGUISpriteBank.hpp" #include "guiengine/widgets/icon_button_widget.hpp" #include "guiengine/widgets/label_widget.hpp" #include "guiengine/widgets/list_widget.hpp" @@ -86,6 +82,18 @@ void NetworkingLobby::loadedFromFile() m_exit_widget = getWidget<IconButtonWidget>("exit"); assert(m_exit_widget != NULL); + m_icon_bank = new irr::gui::STKModifiedSpriteBank(GUIEngine::getGUIEnv()); + video::ITexture* icon_1 = irr_driver->getTexture + (file_manager->getAsset(FileManager::GUI, "cup_gold.png")); + video::ITexture* icon_2 = irr_driver->getTexture + (file_manager->getAsset(FileManager::GUI, "difficulty_medium.png")); + video::ITexture* icon_3 = irr_driver->getTexture + (file_manager->getAsset(FileManager::GUI, "main_help.png")); + m_icon_bank->addTextureAsSprite(icon_1); + m_icon_bank->addTextureAsSprite(icon_2); + m_icon_bank->addTextureAsSprite(icon_3); + const int screen_width = irr_driver->getFrameSize().Width; + m_icon_bank->setScale(screen_width > 1280 ? 0.4f : 0.25f); } // loadedFromFile // --------------------------------------------------------------------------- @@ -105,7 +113,8 @@ void NetworkingLobby::init() // For now create the active player and bind it to the right // input device. - InputDevice *device = input_manager->getDeviceManager()->getLatestUsedDevice(); + InputDevice* device = + input_manager->getDeviceManager()->getLatestUsedDevice(); PlayerProfile* profile = PlayerManager::getCurrentPlayer(); StateManager::get()->createActivePlayer(profile, device); } // init @@ -241,6 +250,13 @@ void NetworkingLobby::eventCallback(Widget* widget, const std::string& name, } // eventCallback +// ---------------------------------------------------------------------------- +void NetworkingLobby::unloaded() +{ + delete m_icon_bank; + m_icon_bank = NULL; +} // unloaded + // ---------------------------------------------------------------------------- void NetworkingLobby::tearDown() @@ -248,7 +264,6 @@ void NetworkingLobby::tearDown() } // tearDown // ---------------------------------------------------------------------------- - bool NetworkingLobby::onEscapePressed() { STKHost::get()->shutdown(); @@ -256,25 +271,29 @@ bool NetworkingLobby::onEscapePressed() } // onEscapePressed // ---------------------------------------------------------------------------- -void NetworkingLobby::addPlayer(const std::tuple<uint32_t, uint32_t, - core::stringw, bool>& p) +void NetworkingLobby::updatePlayers(const std::vector<std::tuple<uint32_t, + uint32_t, core::stringw, int> >& p) { // In GUI-less server this function will be called without proper // initialisation - if (m_player_list) - { - const std::string internal_name = - StringUtils::toString(std::get<0>(p)) + "_" + - StringUtils::toString(std::get<1>(p)); - m_player_list->addItem(internal_name, std::get<2>(p)); - if (std::get<3>(p)) - m_player_list->markItemBlue(internal_name, true); - } -} // addPlayer + if (!m_player_list) + return; + m_player_list->clear(); -// ---------------------------------------------------------------------------- -void NetworkingLobby::cleanPlayers() -{ - if (m_player_list) - m_player_list->clear(); -} // cleanPlayers + if (p.empty()) + return; + + irr::gui::STKModifiedSpriteBank* icon_bank = m_icon_bank; + for (auto& q : p) + { + if (icon_bank) + { + m_player_list->setIcons(icon_bank); + icon_bank = NULL; + } + const std::string internal_name = + StringUtils::toString(std::get<0>(q)) + "_" + + StringUtils::toString(std::get<1>(q)); + m_player_list->addItem(internal_name, std::get<2>(q), std::get<3>(q)); + } +} // updatePlayers diff --git a/src/states_screens/networking_lobby.hpp b/src/states_screens/networking_lobby.hpp index b2a1a3c15..3a11d050f 100644 --- a/src/states_screens/networking_lobby.hpp +++ b/src/states_screens/networking_lobby.hpp @@ -33,6 +33,14 @@ namespace GUIEngine class TextBoxWidget; } +namespace irr +{ + namespace gui + { + class STKModifiedSpriteBank; + } +} + /** * \brief Handles the networking lobby * \ingroup states_screens @@ -55,6 +63,11 @@ private: GUIEngine::ListWidget *m_player_list; GUIEngine::TextBoxWidget* m_chat_box; + irr::gui::STKModifiedSpriteBank* m_icon_bank; + + /** \brief implement optional callback from parent class GUIEngine::Screen */ + virtual void unloaded(); + public: virtual void onUpdate(float delta) OVERRIDE; @@ -81,9 +94,9 @@ public: /** Used to insert each client chat message (reserved). */ void addMoreServerInfo(const core::stringw& info); void setJoinedServer(std::shared_ptr<Server> server); - void addPlayer(const std::tuple<uint32_t/*host id*/, uint32_t/*online id*/, - core::stringw/*player name*/, bool/*is server owner*/>& p); - void cleanPlayers(); + void updatePlayers(const std::vector<std::tuple<uint32_t/*host id*/, + uint32_t/*online id*/, core::stringw/*player name*/, + int/*icon id*/> >& p); }; // class NetworkingLobby #endif