Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/StartupInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class StartupInfo

bool hasConfiguration;
bool autoConnect;
char serverAllowedTeams[7];
char serverName[80];
int serverPort;
bool useUDPconnection;
Expand Down
56 changes: 48 additions & 8 deletions src/bzflag/JoinMenu.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,18 @@ JoinMenu::JoinMenu() : serverStartMenu(NULL), serverMenu(NULL)
std::vector<std::string>& teams = team->getList();
// these do not need to be in enum order, but must match getTeam() & setTeam()
teams.push_back(std::string(Team::getName(AutomaticTeam)));
teams.push_back(std::string(Team::getName(RogueTeam)));
teams.push_back(std::string(Team::getName(RedTeam)));
teams.push_back(std::string(Team::getName(GreenTeam)));
teams.push_back(std::string(Team::getName(BlueTeam)));
teams.push_back(std::string(Team::getName(PurpleTeam)));
teams.push_back(std::string(Team::getName(ObserverTeam)));
if(info->serverAllowedTeams[0] == '1')
teams.push_back(std::string(Team::getName(RogueTeam)));
if(info->serverAllowedTeams[1] == '1')
teams.push_back(std::string(Team::getName(RedTeam)));
if(info->serverAllowedTeams[2] == '1')
teams.push_back(std::string(Team::getName(GreenTeam)));
if(info->serverAllowedTeams[3] == '1')
teams.push_back(std::string(Team::getName(BlueTeam)));
if(info->serverAllowedTeams[4] == '1')
teams.push_back(std::string(Team::getName(PurpleTeam)));
if(info->serverAllowedTeams[5] == '1')
teams.push_back(std::string(Team::getName(ObserverTeam)));
team->update();
setTeam(info->team);
listHUD.push_back(team);
Expand Down Expand Up @@ -161,7 +167,26 @@ void JoinMenu::show()
// set fields
callsign->setString(info->callsign);
password->setString(info->password);
{
std::vector<std::string>& teams = team->getList();
teams.clear();
teams.push_back(std::string(Team::getName(AutomaticTeam)));
if (info->serverAllowedTeams[0] == '1')
teams.push_back(std::string(Team::getName(RogueTeam)));
if (info->serverAllowedTeams[1] == '1')
teams.push_back(std::string(Team::getName(RedTeam)));
if (info->serverAllowedTeams[2] == '1')
teams.push_back(std::string(Team::getName(GreenTeam)));
if (info->serverAllowedTeams[3] == '1')
teams.push_back(std::string(Team::getName(BlueTeam)));
if (info->serverAllowedTeams[4] == '1')
teams.push_back(std::string(Team::getName(PurpleTeam)));
if (info->serverAllowedTeams[5] == '1')
teams.push_back(std::string(Team::getName(ObserverTeam)));
team->update();
}
setTeam(info->team);
updateTeamTexture();

server->setString(info->serverName);
char buffer[10];
Expand Down Expand Up @@ -273,12 +298,27 @@ void JoinMenu::setFailedMessage(const char* msg)

TeamColor JoinMenu::getTeam() const
{
return team->getIndex() == 0 ? AutomaticTeam : TeamColor(team->getIndex() - 1);
const int idx = team->getIndex();
const std::vector<std::string> &list = team->getList();
if (idx < 0 || idx >= (int)list.size())
return AutomaticTeam;
return Team::getTeam(list[idx]);
}

void JoinMenu::setTeam(TeamColor teamcol)
{
team->setIndex(teamcol == AutomaticTeam ? 0 : int(teamcol) + 1);
const std::string want = Team::getName(teamcol);
const std::vector<std::string> &list = team->getList();
for (size_t i = 0; i < list.size(); ++i)
{
if (list[i] == want)
{
team->setIndex((int)i);
return;
}
}
// fallback to Automatic if not found
team->setIndex(0);
}

void JoinMenu::setStatus(const char* msg, const std::vector<std::string> *)
Expand Down
27 changes: 27 additions & 0 deletions src/bzflag/ServerMenu.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
const int ServerMenu::NumReadouts = 24;
const int ServerMenu::NumItems = 10;

char ServerMenu::JoinableTeams[7] = { '1','1','1','1','1','1', '\0' };

ServerMenuDefaultKey::~ServerMenuDefaultKey()
{
delete serverListFilterMenu;
Expand Down Expand Up @@ -552,6 +554,11 @@ void ServerMenu::pick()
char buf[60];
std::vector<HUDuiControl*>& listHUD = getControls();

// reset JoinableTeams
for (int i = 0; i < 6; ++i)
JoinableTeams[i] = '1';
JoinableTeams[6] = '\0';

const uint8_t maxes [] = { ping.maxPlayers, ping.rogueMax, ping.redMax, ping.greenMax,
ping.blueMax, ping.purpleMax, ping.observerMax
};
Expand All @@ -572,47 +579,65 @@ void ServerMenu::pick()
((HUDuiLabel*)listHUD[1])->setLabel(buf);

if (ping.rogueMax == 0)
{
buf[0]=0;
JoinableTeams[0]='0';
}
else if (ping.rogueMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.rogueCount);
else
sprintf(buf, "%d/%d", ping.rogueCount, ping.rogueMax);
((HUDuiLabel*)listHUD[2])->setLabel(buf);

if (ping.redMax == 0)
{
buf[0]=0;
JoinableTeams[1]='0';
}
else if (ping.redMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.redCount);
else
sprintf(buf, "%d/%d", ping.redCount, ping.redMax);
((HUDuiLabel*)listHUD[3])->setLabel(buf);

if (ping.greenMax == 0)
{
buf[0]=0;
JoinableTeams[2]='0';
}
else if (ping.greenMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.greenCount);
else
sprintf(buf, "%d/%d", ping.greenCount, ping.greenMax);
((HUDuiLabel*)listHUD[4])->setLabel(buf);

if (ping.blueMax == 0)
{
buf[0]=0;
JoinableTeams[3]='0';
}
else if (ping.blueMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.blueCount);
else
sprintf(buf, "%d/%d", ping.blueCount, ping.blueMax);
((HUDuiLabel*)listHUD[5])->setLabel(buf);

if (ping.purpleMax == 0)
{
buf[0]=0;
JoinableTeams[4]='0';
}
else if (ping.purpleMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.purpleCount);
else
sprintf(buf, "%d/%d", ping.purpleCount, ping.purpleMax);
((HUDuiLabel*)listHUD[6])->setLabel(buf);

if (ping.observerMax == 0)
{
buf[0]=0;
JoinableTeams[5]='0';
}
else if (ping.observerMax >= ping.maxPlayers)
sprintf(buf, "%d", ping.observerCount);
else
Expand Down Expand Up @@ -810,6 +835,8 @@ void ServerMenu::execute()
info->serverName[sizeof(info->serverName) - 1] = '\0';
info->serverPort = ntohs((unsigned short)
serverList.getServers()[selectedIndex].ping.serverId.port);
strncpy(info->serverAllowedTeams, JoinableTeams, sizeof(info->serverAllowedTeams) - 1);
info->serverAllowedTeams[sizeof(info->serverAllowedTeams) - 1] = '\0';

// all done
HUDDialogStack::get()->pop();
Expand Down
3 changes: 3 additions & 0 deletions src/bzflag/ServerMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class ServerMenu final : public HUDDialog
{
return &defaultKey;
}

int getSelected() const;
void setSelected(int, bool forcerefresh=false);
void show() override;
Expand Down Expand Up @@ -114,6 +115,8 @@ class ServerMenu final : public HUDDialog
int lastWidth, lastHeight;

static const int NumReadouts;

static char JoinableTeams[7];
};


Expand Down
8 changes: 8 additions & 0 deletions src/bzflag/bzflag.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,7 @@ void dumpResources()

BZDB.set("team", Team::getName(startupInfo.team));
BZDB.set("server", startupInfo.serverName);
BZDB.set("serverAllowedTeams", startupInfo.serverAllowedTeams);
if (startupInfo.serverPort != ServerPort)
BZDB.set("port", TextUtils::format("%d", startupInfo.serverPort));
else
Expand Down Expand Up @@ -837,6 +838,13 @@ int main(int argc, char** argv)
sizeof(startupInfo.serverName) - 1);
startupInfo.serverName[sizeof(startupInfo.serverName) - 1] = '\0';
}
if (BZDB.isSet("serverAllowedTeams"))
{
// Flawfinder: ignore
strncpy(startupInfo.serverAllowedTeams, BZDB.get("serverAllowedTeams").c_str(),
sizeof(startupInfo.serverAllowedTeams) - 1);
startupInfo.serverAllowedTeams[sizeof(startupInfo.serverAllowedTeams) - 1] = '\0';
}
if (BZDB.isSet("port"))
startupInfo.serverPort = atoi(BZDB.get("port").c_str());

Expand Down
2 changes: 2 additions & 0 deletions src/game/StartupInfo.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ StartupInfo::StartupInfo() : hasConfiguration(false),
listServerURL(DefaultListServerURL),
listServerPort(ServerPort + 1)
{
strcpy(serverAllowedTeams, "111111");
strcpy(serverName, "");
strcpy(callsign, "");
strcpy(password, "");
Expand All @@ -39,6 +40,7 @@ StartupInfo::~StartupInfo()
{
hasConfiguration = false;
autoConnect = false;
memset(serverAllowedTeams, 0, 7);
memset(serverName, 0, 80);
serverPort = -1;
useUDPconnection = false;
Expand Down
Loading