Skip to content

Commit

Permalink
identity: Show players in different colours, depending on whether the…
Browse files Browse the repository at this point in the history
… 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.
  • Loading branch information
Cyp committed Jun 3, 2013
1 parent 69e0e28 commit 5daa48b
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 4 deletions.
4 changes: 4 additions & 0 deletions data/base/palette.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
6 changes: 5 additions & 1 deletion lib/ivis_opengl/piepalette.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

//*************************************************************************

Expand Down
33 changes: 30 additions & 3 deletions src/multiint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand Down
4 changes: 4 additions & 0 deletions src/multiplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
37 changes: 37 additions & 0 deletions src/multistat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include "main.h"
#include "mission.h" // for cheats
#include "multistat.h"
#include <QtCore/QSettings>


// ////////////////////////////////////////////////////////////////////////////
// STATS STUFF
Expand Down Expand Up @@ -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();
}
4 changes: 4 additions & 0 deletions src/multistat.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define __INCLUDED_SRC_MULTISTATS_H__

#include "lib/netplay/netplay.h"
#include <map>

struct PLAYERSTATS
{
Expand Down Expand Up @@ -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__

0 comments on commit 5daa48b

Please sign in to comment.