identity: Show players in different colours, depending on whether the player was seen before or is lagging.
Also, don't start the game if a player is lagging, since in that case, the game might anyway not actually start until the player finally times out.master
parent
69e0e280b9
commit
5daa48b880
|
@ -89,3 +89,7 @@ ff,80,40,ff // construction bar text
|
|||
80,c0,00,ff // WZCOL_MAP_PREVIEW_BARREL
|
||||
00,00,ff,ff // constructor beam
|
||||
ff,00,00,ff // demolish beam
|
||||
68,38,38,ff // This player has ridiculously high ping.
|
||||
98,98,98,ff // Don't know this player.
|
||||
ff,ff,f0,ff // Seen this player before.
|
||||
b0,b0,ff,ff // Server knows this player.
|
||||
|
|
|
@ -113,8 +113,12 @@
|
|||
#define WZCOL_MAP_PREVIEW_BARREL psPalette[88]
|
||||
#define WZCOL_CONSTRUCTOR_BEAM psPalette[89]
|
||||
#define WZCOL_DEMOLISH_BEAM psPalette[90]
|
||||
#define WZCOL_FORM_PLAYER_NOPING psPalette[91]
|
||||
#define WZCOL_FORM_PLAYER_UNKNOWN psPalette[92]
|
||||
#define WZCOL_FORM_PLAYER_KNOWN psPalette[93]
|
||||
#define WZCOL_FORM_PLAYER_KNOWN_BY_SERVER psPalette[94]
|
||||
|
||||
#define WZCOL_MAX 91
|
||||
#define WZCOL_MAX 95
|
||||
|
||||
//*************************************************************************
|
||||
|
||||
|
|
|
@ -4030,6 +4030,16 @@ static void displayDifficulty(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset)
|
|||
iV_DrawText(gettext(difficultyList[j]), x + 42, y + 22);
|
||||
}
|
||||
|
||||
static bool isKnownPlayer(std::map<std::string, EcKey::Key> const &knownPlayers, std::string const &name, EcKey const &key)
|
||||
{
|
||||
if (key.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
std::map<std::string, EcKey::Key>::const_iterator i = knownPlayers.find(name);
|
||||
return i != knownPlayers.end() && key.toBytes(EcKey::Public) == i->second;
|
||||
}
|
||||
|
||||
// ////////////////////////////////////////////////////////////////////////////
|
||||
void displayPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset)
|
||||
{
|
||||
|
@ -4062,13 +4072,30 @@ void displayPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset)
|
|||
}
|
||||
else if (ingame.localOptionsReceived && NetPlay.players[j].allocated) // only draw if real player!
|
||||
{
|
||||
std::string name = NetPlay.players[j].name;
|
||||
|
||||
drawBlueBox(x, y, psWidget->width(), psWidget->height());
|
||||
|
||||
iV_SetFont(font_regular); // font
|
||||
iV_SetTextColour(WZCOL_FORM_TEXT);
|
||||
std::map<std::string, EcKey::Key> serverPlayers; // TODO Fill this with players known to the server (needs implementing on the server, too). Currently useless.
|
||||
if (ingame.PingTimes[j] >= PING_LIMIT)
|
||||
{
|
||||
iV_SetTextColour(WZCOL_FORM_PLAYER_NOPING);
|
||||
}
|
||||
else if (isKnownPlayer(serverPlayers, name, getMultiStats(j).identity))
|
||||
{
|
||||
iV_SetTextColour(WZCOL_FORM_PLAYER_KNOWN_BY_SERVER);
|
||||
}
|
||||
else if (isKnownPlayer(getKnownPlayers(), name, getMultiStats(j).identity))
|
||||
{
|
||||
iV_SetTextColour(WZCOL_FORM_PLAYER_KNOWN);
|
||||
}
|
||||
else
|
||||
{
|
||||
iV_SetTextColour(WZCOL_FORM_PLAYER_UNKNOWN);
|
||||
}
|
||||
|
||||
// name
|
||||
std::string name = NetPlay.players[j].name;
|
||||
if (iV_GetTextWidth(name.c_str()) > psWidget->width() - nameX)
|
||||
{
|
||||
while (!name.empty() && iV_GetTextWidth((name + "...").c_str()) > psWidget->width() - nameX)
|
||||
|
@ -4397,7 +4424,7 @@ bool multiplayPlayersReady(bool bNotifyStatus)
|
|||
for(player = 0; player < game.maxPlayers; player++)
|
||||
{
|
||||
// check if this human player is ready, ignore AIs
|
||||
if (NetPlay.players[player].allocated && !NetPlay.players[player].ready)
|
||||
if (NetPlay.players[player].allocated && (!NetPlay.players[player].ready || ingame.PingTimes[player] >= PING_LIMIT))
|
||||
{
|
||||
if(bNotifyStatus)
|
||||
{
|
||||
|
|
|
@ -714,6 +714,10 @@ bool recvMessage(void)
|
|||
break;
|
||||
}
|
||||
// This player is now with us!
|
||||
if (ingame.JoiningInProgress[player_id])
|
||||
{
|
||||
addKnownPlayer(NetPlay.players[player_id].name, getMultiStats(player_id).identity);
|
||||
}
|
||||
ingame.JoiningInProgress[player_id] = false;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include "main.h"
|
||||
#include "mission.h" // for cheats
|
||||
#include "multistat.h"
|
||||
#include <QtCore/QSettings>
|
||||
|
||||
|
||||
// ////////////////////////////////////////////////////////////////////////////
|
||||
// STATS STUFF
|
||||
|
@ -314,3 +316,38 @@ void updateMultiStatsKills(BASE_OBJECT *psKilled,UDWORD player)
|
|||
ingame.skScores[player][1]++;
|
||||
}
|
||||
}
|
||||
|
||||
static std::map<std::string, EcKey::Key> knownPlayers;
|
||||
static QSettings *knownPlayersIni = nullptr;
|
||||
|
||||
std::map<std::string, EcKey::Key> const &getKnownPlayers()
|
||||
{
|
||||
if (knownPlayersIni == nullptr)
|
||||
{
|
||||
knownPlayersIni = new QSettings(PHYSFS_getWriteDir() + QString("/") + "knownPlayers.ini", QSettings::IniFormat);
|
||||
QStringList names = knownPlayersIni->allKeys();
|
||||
for (int i = 0; i < names.size(); ++i)
|
||||
{
|
||||
knownPlayers[names[i].toUtf8().constData()] = base64Decode(knownPlayersIni->value(names[i]).toString().toStdString());
|
||||
}
|
||||
}
|
||||
return knownPlayers;
|
||||
}
|
||||
|
||||
void addKnownPlayer(std::string const &name, EcKey const &key, bool override)
|
||||
{
|
||||
if (key.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!override && knownPlayers.find(name) != knownPlayers.end())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
getKnownPlayers(); // Init knownPlayersIni.
|
||||
knownPlayers[name] = key.toBytes(EcKey::Public);
|
||||
knownPlayersIni->setValue(QString::fromUtf8(name.c_str()), base64Encode(key.toBytes(EcKey::Public)).c_str());
|
||||
knownPlayersIni->sync();
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define __INCLUDED_SRC_MULTISTATS_H__
|
||||
|
||||
#include "lib/netplay/netplay.h"
|
||||
#include <map>
|
||||
|
||||
struct PLAYERSTATS
|
||||
{
|
||||
|
@ -54,4 +55,7 @@ void updateMultiStatsLoses(void);
|
|||
void updateMultiStatsKills(BASE_OBJECT *psKilled,UDWORD player);
|
||||
void recvMultiStats(NETQUEUE queue);
|
||||
|
||||
std::map<std::string, EcKey::Key> const &getKnownPlayers();
|
||||
void addKnownPlayer(std::string const &name, EcKey const &key, bool override = false);
|
||||
|
||||
#endif // __INCLUDED_SRC_MULTISTATS_H__
|
||||
|
|
Loading…
Reference in New Issue