Skip to content

Commit 9e499d8

Browse files
committed
Don't (mistakenly) reset kart data upon loading the world
Instead find it separately if it's different
1 parent e18cd66 commit 9e499d8

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

src/network/kart_data.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class KartData
2929
KartData(const BareNetworkString& ns);
3030
// ------------------------------------------------------------------------
3131
void encode(BareNetworkString* ns) const;
32+
3233
}; // class KartData
3334

3435
#endif // KART_DATA_HPP

src/network/protocols/server_lobby.cpp

+52-20
Original file line numberDiff line numberDiff line change
@@ -1987,7 +1987,23 @@ void ServerLobby::asynchronousUpdate()
19871987
if (areKartFiltersIgnoringKarts())
19881988
current_kart = "";
19891989
std::string name = StringUtils::wideToUtf8(players[i]->getName());
1990-
players[i]->setKartName(getKartForBadKartChoice(players[i]->getPeer().get(), name, current_kart));
1990+
// Note 1: setKartName also resets KartData, and should be called
1991+
// only if current kart name is not suitable.
1992+
// Note 2: filters only support standard karts for now, so GKFBKC
1993+
// cannot return an addon; when addons are supported, this part of
1994+
// code will also have to provide kart data (or setKartName has to
1995+
// set the correct hitbox itself).
1996+
std::string new_kart = getKartForBadKartChoice(
1997+
players[i]->getPeer().get(), name, current_kart);
1998+
if (new_kart != current_kart)
1999+
{
2000+
// Filters only support standard karts for now, but when they
2001+
// start supporting addons, probably type should not be empty
2002+
players[i]->setKartName(new_kart);
2003+
KartData kart_data;
2004+
setKartDataProperly(kart_data, new_kart, players[i], "");
2005+
players[i]->setKartData(kart_data);
2006+
}
19912007
}
19922008

19932009
NetworkString* load_world_message = getLoadWorldMessage(players,
@@ -6358,25 +6374,7 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const
63586374
std::string type = kart_data.m_kart_type;
63596375
auto& player = peer->getPlayerProfiles()[i];
63606376
const std::string& kart_id = player->getKartName();
6361-
if (NetworkConfig::get()->useTuxHitboxAddon() &&
6362-
StringUtils::startsWith(kart_id, "addon_") &&
6363-
kart_properties_manager->hasKartTypeCharacteristic(type))
6364-
{
6365-
const KartProperties* real_addon =
6366-
kart_properties_manager->getKart(kart_id);
6367-
if (ServerConfig::m_real_addon_karts && real_addon)
6368-
{
6369-
kart_data = KartData(real_addon);
6370-
}
6371-
else
6372-
{
6373-
const KartProperties* tux_kp =
6374-
kart_properties_manager->getKart("tux");
6375-
kart_data = KartData(tux_kp);
6376-
kart_data.m_kart_type = type;
6377-
}
6378-
player->setKartData(kart_data);
6379-
}
6377+
setKartDataProperly(kart_data, kart_id, player, type);
63806378
}
63816379
} // setPlayerKarts
63826380

@@ -8289,3 +8287,37 @@ std::string ServerLobby::getKartForBadKartChoice(STKPeer* peer, const std::strin
82898287
return *it;
82908288
} // getKartForRandomKartChoice
82918289
//-----------------------------------------------------------------------------
8290+
void ServerLobby::setKartDataProperly(KartData& kart_data, const std::string& kart_name,
8291+
std::shared_ptr<NetworkPlayerProfile> player,
8292+
const std::string& type) const
8293+
{
8294+
// This should set kart data for kart name at least in the following cases:
8295+
// 1. useTuxHitboxAddon() is true
8296+
// 2. kart_name is installed on the server
8297+
// (for addons; standard karts are not processed here it seems)
8298+
// 3. kart type is fine
8299+
// Maybe I'm mistaken and then it should be fixed.
8300+
// I extracted this into a separate function because if kart_name is set
8301+
// by the server (for random addon kart, or due to a filter), kart data
8302+
// has to be set in another place than default one.
8303+
if (NetworkConfig::get()->useTuxHitboxAddon() &&
8304+
StringUtils::startsWith(kart_name, "addon_") &&
8305+
kart_properties_manager->hasKartTypeCharacteristic(type))
8306+
{
8307+
const KartProperties* real_addon =
8308+
kart_properties_manager->getKart(kart_name);
8309+
if (ServerConfig::m_real_addon_karts && real_addon)
8310+
{
8311+
kart_data = KartData(real_addon);
8312+
}
8313+
else
8314+
{
8315+
const KartProperties* tux_kp =
8316+
kart_properties_manager->getKart("tux");
8317+
kart_data = KartData(tux_kp);
8318+
kart_data.m_kart_type = type;
8319+
}
8320+
player->setKartData(kart_data);
8321+
}
8322+
} // setKartDataProperly
8323+
//-----------------------------------------------------------------------------

src/network/protocols/server_lobby.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,9 @@ class ServerLobby : public LobbyProtocol
686686
void applyAllKartFilters(const std::string& username, std::set<std::string>& karts, bool afterSelection = false) const;
687687
bool areKartFiltersIgnoringKarts() const;
688688
std::string getKartForBadKartChoice(STKPeer* peer, const std::string& username, const std::string& check_choice) const;
689+
void setKartDataProperly(KartData& kart_data, const std::string& kart_name,
690+
std::shared_ptr<NetworkPlayerProfile> player,
691+
const std::string& type) const;
689692

690693
static int m_default_fixed_laps;
691694
}; // class ServerLobby

0 commit comments

Comments
 (0)