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
Cyp 2013-06-03 23:13:36 +02:00
parent 69e0e280b9
commit 5daa48b880
6 changed files with 84 additions and 4 deletions

View File

@ -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.

View File

@ -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
//*************************************************************************

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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__