From 275dbe3631bbf77bc559210199881882e7abc2f7 Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 16 Jun 2019 15:25:53 +0800 Subject: [PATCH] Show country flag in soccer if client supports --- data/stk_config.xml | 1 + src/modes/capture_the_flag.cpp | 4 +- src/modes/capture_the_flag.hpp | 3 +- src/modes/free_for_all.cpp | 2 +- src/modes/free_for_all.hpp | 3 +- src/modes/linear_world.cpp | 2 +- src/modes/linear_world.hpp | 3 +- src/modes/soccer_world.cpp | 58 ++++++++++++++++++++++---- src/modes/soccer_world.hpp | 5 ++- src/modes/world.hpp | 3 +- src/network/protocols/server_lobby.cpp | 2 +- 11 files changed, 67 insertions(+), 19 deletions(-) diff --git a/data/stk_config.xml b/data/stk_config.xml index 86668218b..428243d18 100644 --- a/data/stk_config.xml +++ b/data/stk_config.xml @@ -586,5 +586,6 @@ --> + diff --git a/src/modes/capture_the_flag.cpp b/src/modes/capture_the_flag.cpp index f7fd8df4d..9ea443590 100644 --- a/src/modes/capture_the_flag.cpp +++ b/src/modes/capture_the_flag.cpp @@ -537,9 +537,9 @@ const std::string& CaptureTheFlag::getIdent() const } // getIdent // ---------------------------------------------------------------------------- -void CaptureTheFlag::saveCompleteState(BareNetworkString* bns) +void CaptureTheFlag::saveCompleteState(BareNetworkString* bns, STKPeer* peer) { - FreeForAll::saveCompleteState(bns); + FreeForAll::saveCompleteState(bns, peer); bns->addUInt32(m_red_scores).addUInt32(m_blue_scores); } // saveCompleteState diff --git a/src/modes/capture_the_flag.hpp b/src/modes/capture_the_flag.hpp index 2d946a84f..040cbda14 100644 --- a/src/modes/capture_the_flag.hpp +++ b/src/modes/capture_the_flag.hpp @@ -157,7 +157,8 @@ public: return progress; } // ------------------------------------------------------------------------ - virtual void saveCompleteState(BareNetworkString* bns) OVERRIDE; + virtual void saveCompleteState(BareNetworkString* bns, + STKPeer* peer) OVERRIDE; // ------------------------------------------------------------------------ virtual void restoreCompleteState(const BareNetworkString& b) OVERRIDE; }; // CaptureTheFlag diff --git a/src/modes/free_for_all.cpp b/src/modes/free_for_all.cpp index a252016e7..815c7376d 100644 --- a/src/modes/free_for_all.cpp +++ b/src/modes/free_for_all.cpp @@ -252,7 +252,7 @@ bool FreeForAll::getKartFFAResult(int kart_id) const } // getKartFFAResult // ---------------------------------------------------------------------------- -void FreeForAll::saveCompleteState(BareNetworkString* bns) +void FreeForAll::saveCompleteState(BareNetworkString* bns, STKPeer* peer) { for (unsigned i = 0; i < m_scores.size(); i++) bns->addUInt32(m_scores[i]); diff --git a/src/modes/free_for_all.hpp b/src/modes/free_for_all.hpp index 2025c04c0..ea7724430 100644 --- a/src/modes/free_for_all.hpp +++ b/src/modes/free_for_all.hpp @@ -80,7 +80,8 @@ public: m_scores.at(kart_id) = 0; } // ------------------------------------------------------------------------ - virtual void saveCompleteState(BareNetworkString* bns) OVERRIDE; + virtual void saveCompleteState(BareNetworkString* bns, + STKPeer* peer) OVERRIDE; // ------------------------------------------------------------------------ virtual void restoreCompleteState(const BareNetworkString& b) OVERRIDE; }; // FreeForAll diff --git a/src/modes/linear_world.cpp b/src/modes/linear_world.cpp index 51474b023..096b16e85 100644 --- a/src/modes/linear_world.cpp +++ b/src/modes/linear_world.cpp @@ -1116,7 +1116,7 @@ void LinearWorld::KartInfo::restoreCompleteState(const BareNetworkString& b) } // restoreCompleteState // ---------------------------------------------------------------------------- -void LinearWorld::saveCompleteState(BareNetworkString* bns) +void LinearWorld::saveCompleteState(BareNetworkString* bns, STKPeer* peer) { bns->addUInt32(m_fastest_lap_ticks); bns->addFloat(m_distance_increase); diff --git a/src/modes/linear_world.hpp b/src/modes/linear_world.hpp index 6975ff2d9..ab3a0d290 100644 --- a/src/modes/linear_world.hpp +++ b/src/modes/linear_world.hpp @@ -226,7 +226,8 @@ public: virtual std::pair getGameStartedProgress() const OVERRIDE; // ------------------------------------------------------------------------ - virtual void saveCompleteState(BareNetworkString* bns) OVERRIDE; + virtual void saveCompleteState(BareNetworkString* bns, + STKPeer* peer) OVERRIDE; // ------------------------------------------------------------------------ virtual void restoreCompleteState(const BareNetworkString& b) OVERRIDE; // ------------------------------------------------------------------------ diff --git a/src/modes/soccer_world.cpp b/src/modes/soccer_world.cpp index 471eaa56b..b71314d34 100644 --- a/src/modes/soccer_world.cpp +++ b/src/modes/soccer_world.cpp @@ -32,6 +32,7 @@ #include "network/network_string.hpp" #include "network/protocols/game_events_protocol.hpp" #include "network/stk_host.hpp" +#include "network/stk_peer.hpp" #include "physics/physics.hpp" #include "states_screens/race_gui_base.hpp" #include "tracks/graph.hpp" @@ -40,6 +41,7 @@ #include "tracks/track_object_manager.hpp" #include "tracks/track_sector.hpp" #include "utils/constants.hpp" +#include "utils/string_utils.hpp" #include #include @@ -275,7 +277,8 @@ void SoccerWorld::onCheckGoalTriggered(bool first_goal) sd.m_correct_goal = isCorrectGoal(m_ball_hitter, first_goal); sd.m_kart = getKart(m_ball_hitter)->getIdent(); sd.m_player = getKart(m_ball_hitter)->getController()->getName(); - + sd.m_country_flag = StringUtils::getCountryFlag( + race_manager->getKartInfo(m_ball_hitter).getCountryCode()); if (sd.m_correct_goal) { m_karts[m_ball_hitter]->getKartModel() @@ -319,9 +322,32 @@ void SoccerWorld::onCheckGoalTriggered(bool first_goal) .addUInt8((uint8_t)sd.m_id).addUInt8(sd.m_correct_goal) .addUInt8(first_goal).addFloat(sd.m_time) .addTime(m_ticks_back_to_own_goal) - .encodeString(sd.m_kart) - .encodeString(sd.m_player); - STKHost::get()->sendPacketToAllPeers(&p, true); + .encodeString(sd.m_kart); + core::stringw player_name = sd.m_player; + NetworkString p_with_flag = p; + p.encodeString(player_name); + if (!sd.m_country_flag.empty()) + { + player_name += L" "; + player_name += sd.m_country_flag; + } + p_with_flag.encodeString(player_name); + auto peers = STKHost::get()->getPeers(); + for (auto& peer : peers) + { + if (peer->isValidated() && !peer->isWaitingForGame()) + { + if (peer->getClientCapabilities().find("country_flag") != + peer->getClientCapabilities().end()) + { + peer->sendPacket(&p_with_flag, true/*reliable*/); + } + else + { + peer->sendPacket(&p, true/*reliable*/); + } + } + } } } for (unsigned i = 0; i < m_karts.size(); i++) @@ -740,7 +766,7 @@ void SoccerWorld::enterRaceOverState() } // enterRaceOverState // ---------------------------------------------------------------------------- -void SoccerWorld::saveCompleteState(BareNetworkString* bns) +void SoccerWorld::saveCompleteState(BareNetworkString* bns, STKPeer* peer) { const unsigned red_scorers = (unsigned)m_red_scorers.size(); bns->addUInt32(red_scorers); @@ -749,8 +775,15 @@ void SoccerWorld::saveCompleteState(BareNetworkString* bns) bns->addUInt8((uint8_t)m_red_scorers[i].m_id) .addUInt8(m_red_scorers[i].m_correct_goal) .addFloat(m_red_scorers[i].m_time) - .encodeString(m_red_scorers[i].m_kart) - .encodeString(m_red_scorers[i].m_player); + .encodeString(m_red_scorers[i].m_kart); + core::stringw player_name = m_red_scorers[i].m_player; + if (peer->getClientCapabilities().find("country_flag") != + peer->getClientCapabilities().end()) + { + player_name += L" "; + player_name += m_red_scorers[i].m_country_flag; + } + bns->encodeString(player_name); } const unsigned blue_scorers = (unsigned)m_blue_scorers.size(); @@ -760,8 +793,15 @@ void SoccerWorld::saveCompleteState(BareNetworkString* bns) bns->addUInt8((uint8_t)m_blue_scorers[i].m_id) .addUInt8(m_blue_scorers[i].m_correct_goal) .addFloat(m_blue_scorers[i].m_time) - .encodeString(m_blue_scorers[i].m_kart) - .encodeString(m_blue_scorers[i].m_player); + .encodeString(m_blue_scorers[i].m_kart); + core::stringw player_name = m_blue_scorers[i].m_player; + if (peer->getClientCapabilities().find("country_flag") != + peer->getClientCapabilities().end()) + { + player_name += L" "; + player_name += m_blue_scorers[i].m_country_flag; + } + bns->encodeString(player_name); } bns->addTime(m_reset_ball_ticks).addTime(m_ticks_back_to_own_goal); } // saveCompleteState diff --git a/src/modes/soccer_world.hpp b/src/modes/soccer_world.hpp index 45e1d2784..3b92e9868 100644 --- a/src/modes/soccer_world.hpp +++ b/src/modes/soccer_world.hpp @@ -53,6 +53,8 @@ public: std::string m_kart; /** Player name which scores. */ core::stringw m_player; + /** Country flag of player (used in server only). */ + core::stringw m_country_flag; }; // ScorerData private: @@ -414,7 +416,8 @@ public: return progress; } // ------------------------------------------------------------------------ - virtual void saveCompleteState(BareNetworkString* bns) OVERRIDE; + virtual void saveCompleteState(BareNetworkString* bns, + STKPeer* peer) OVERRIDE; // ------------------------------------------------------------------------ virtual void restoreCompleteState(const BareNetworkString& b) OVERRIDE; // ------------------------------------------------------------------------ diff --git a/src/modes/world.hpp b/src/modes/world.hpp index 238aa7d7f..84835a904 100644 --- a/src/modes/world.hpp +++ b/src/modes/world.hpp @@ -46,6 +46,7 @@ class btRigidBody; class Controller; class ItemState; class PhysicalObject; +class STKPeer; namespace Scripting { @@ -339,7 +340,7 @@ public: m_eliminated_karts--; } // ------------------------------------------------------------------------ - virtual void saveCompleteState(BareNetworkString* bns) {} + virtual void saveCompleteState(BareNetworkString* bns, STKPeer* peer) {} // ------------------------------------------------------------------------ virtual void restoreCompleteState(const BareNetworkString& buffer) {} // ------------------------------------------------------------------------ diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 6013126de..20be6cf02 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -1575,7 +1575,7 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event) nim->saveCompleteState(ns); nim->addLiveJoinPeer(peer); - w->saveCompleteState(ns); + w->saveCompleteState(ns, peer.get()); if (race_manager->supportsLiveJoining()) { // Only needed in non-racing mode as no need players can added after