Add player addons scores info

This commit is contained in:
Benau 2019-12-03 16:40:48 +08:00
parent 01ec6e3c4d
commit 97be595725
3 changed files with 110 additions and 0 deletions

View File

@ -3020,9 +3020,58 @@ bool ServerLobby::handleAssets(const NetworkString& ns, STKPeer* peer) const
return false;
}
std::array<int, AS_TOTAL> addons_scores = {{ -1, -1, -1, -1 }};
size_t addon_kart = 0;
size_t addon_track = 0;
size_t addon_arena = 0;
size_t addon_soccer = 0;
for (auto& kart : m_addon_kts.first)
{
if (client_karts.find(kart) != client_karts.end())
addon_kart++;
}
for (auto& track : m_addon_kts.second)
{
if (client_tracks.find(track) != client_tracks.end())
addon_track++;
}
for (auto& arena : m_addon_arenas)
{
if (client_tracks.find(arena) != client_tracks.end())
addon_arena++;
}
for (auto& soccer : m_addon_soccers)
{
if (client_tracks.find(soccer) != client_tracks.end())
addon_soccer++;
}
if (!m_addon_kts.first.empty())
{
addons_scores[AS_KART] = int
((float)addon_kart / (float)m_addon_kts.first.size() * 100.0);
}
if (!m_addon_kts.second.empty())
{
addons_scores[AS_TRACK] = int
((float)addon_track / (float)m_addon_kts.second.size() * 100.0);
}
if (!m_addon_arenas.empty())
{
addons_scores[AS_ARENA] = int
((float)addon_arena / (float)m_addon_arenas.size() * 100.0);
}
if (!m_addon_soccers.empty())
{
addons_scores[AS_SOCCER] = int
((float)addon_soccer / (float)m_addon_soccers.size() * 100.0);
}
// Save available karts and tracks from clients in STKPeer so if this peer
// disconnects later in lobby it won't affect current players
peer->setAvailableKartsTracks(client_karts, client_tracks);
peer->setAddonsScores(addons_scores);
return true;
} // handleAssets
@ -5000,6 +5049,49 @@ void ServerLobby::handleServerCommand(Event* event, STKPeer* peer) const
peer->sendPacket(chat, true/*reliable*/);
delete chat;
}
else if (StringUtils::startsWith(cmd, "playeraddonscore"))
{
NetworkString* chat = getNetworkString();
chat->addUInt8(LE_CHAT);
chat->setSynchronous(true);
std::string player_name;
if (cmd.length() > 17)
player_name = cmd.substr(17);
std::shared_ptr<STKPeer> player_peer = STKHost::get()->findPeerByName(
StringUtils::utf8ToWide(player_name));
if (player_name.empty() || !player_peer)
{
chat->encodeString16(
L"Usage: /playeraddonscore [player name] (return 0-100)");
}
else
{
auto& scores = player_peer->getAddonsScores();
if (scores[AS_KART] == -1 && scores[AS_TRACK] == -1 &&
scores[AS_ARENA] == -1 && scores[AS_SOCCER] == -1)
{
chat->encodeString16(StringUtils::utf8ToWide
(player_name + " has no addon"));
}
else
{
std::string msg = player_name;
msg += " addon:";
if (scores[AS_KART] != -1)
msg += " kart: " + StringUtils::toString(scores[AS_KART]) + ",";
if (scores[AS_TRACK] != -1)
msg += " track: " + StringUtils::toString(scores[AS_TRACK]) + ",";
if (scores[AS_ARENA] != -1)
msg += " arena: " + StringUtils::toString(scores[AS_ARENA]) + ",";
if (scores[AS_SOCCER] != -1)
msg += " soccer: " + StringUtils::toString(scores[AS_SOCCER]) + ",";
msg = msg.substr(0, msg.size() - 1);
chat->encodeString16(StringUtils::utf8ToWide(msg));
}
}
peer->sendPacket(chat, true/*reliable*/);
delete chat;
}
else if (argv[0] == "serverhasaddon")
{
NetworkString* chat = getNetworkString();

View File

@ -37,6 +37,7 @@
STKPeer::STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id)
: m_peer_address(enet_peer->address), m_host(host)
{
m_addons_scores.fill(-1);
// We use 0.x.x.x ip to map to IPv6 address internally
if (m_peer_address.getIP() < 16777216)
m_ipv6_address = getIPV6ReadableFromMappedAddress(&enet_peer->address);

View File

@ -30,6 +30,7 @@
#include <enet/enet.h>
#include <array>
#include <atomic>
#include <deque>
#include <memory>
@ -52,6 +53,15 @@ enum PeerDisconnectInfo : unsigned int
PDI_KICK_HIGH_PING = 3, //!< Too high ping, kicked by server
}; // PeerDisconnectInfo
enum AddonScore : int
{
AS_KART = 0,
AS_TRACK = 1,
AS_ARENA = 2,
AS_SOCCER = 3,
AS_TOTAL = 4,
}; // AddonScore
/*! \class STKPeer
* \brief Represents a peer.
* This class is used to interface the ENetPeer structure.
@ -108,6 +118,7 @@ protected:
* features available in same version. */
std::set<std::string> m_client_capabilities;
std::array<int, AS_TOTAL> m_addons_scores;
public:
STKPeer(ENetPeer *enet_peer, STKHost* host, uint32_t host_id);
// ------------------------------------------------------------------------
@ -256,6 +267,12 @@ public:
void setPacketLoss(int loss) { m_packet_loss.store(loss); }
// ------------------------------------------------------------------------
int getPacketLoss() const { return m_packet_loss.load(); }
// ------------------------------------------------------------------------
const std::array<int, AS_TOTAL>& getAddonsScores() const
{ return m_addons_scores; }
// ------------------------------------------------------------------------
void setAddonsScores(const std::array<int, AS_TOTAL>& scores)
{ m_addons_scores = scores; }
}; // STKPeer
#endif // STK_PEER_HPP