hopefully better commanding of headless servers

This commit is contained in:
Titus Tscharntke 2012-07-05 22:03:15 +00:00
parent 2ad24dbe2a
commit e302efcd4e
5 changed files with 118 additions and 53 deletions

View File

@ -36,7 +36,7 @@
namespace Glest{ namespace Game{
static const string ITEM_MISSING = "***missing***";
const int MASTERSERVER_BROADCAST_SETTINGS_SECONDS = 4;
const int HEADLESSSERVER_BROADCAST_SETTINGS_SECONDS = 4;
static const char *HEADLESS_SAVED_GAME_FILENAME = "lastHeadlessGamSettings.mgg";
using namespace Shared::Util;
@ -1017,7 +1017,7 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){
}
}
if(isMasterserverAdmin() == true) {
if(isHeadlessAdmin() == true) {
//printf("#1 admin key [%d] client key [%d]\n",settings->getMasterserver_admin(),clientInterface->getSessionKey());
mouseClickAdmin(x, y, mouseButton);
}
@ -1025,7 +1025,7 @@ void MenuStateConnectedGame::mouseClick(int x, int y, MouseButton mouseButton){
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
}
bool MenuStateConnectedGame::isMasterserverAdmin() {
bool MenuStateConnectedGame::isHeadlessAdmin() {
bool result = false;
ClientInterface* clientInterface= NetworkManager::getInstance().getClientInterface();
@ -1043,13 +1043,13 @@ bool MenuStateConnectedGame::isMasterserverAdmin() {
return result;
}
void MenuStateConnectedGame::broadCastGameSettingsToMasterserver(bool forceNow) {
if(isMasterserverAdmin() == false) {
void MenuStateConnectedGame::broadCastGameSettingsToHeadlessServer(bool forceNow) {
if(isHeadlessAdmin() == false) {
return;
}
if(forceNow == true ||
(needToBroadcastServerSettings == true && difftime(time(NULL),broadcastServerSettingsDelayTimer) >= MASTERSERVER_BROADCAST_SETTINGS_SECONDS)) {
((needToBroadcastServerSettings == true ) && ( difftime(time(NULL),broadcastServerSettingsDelayTimer) >= HEADLESSSERVER_BROADCAST_SETTINGS_SECONDS))) {
//printf("In [%s:%s] Line: %d forceNow = %d broadcastServerSettingsDelayTimer = %lu, now =%lu\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,forceNow,broadcastServerSettingsDelayTimer,time(NULL));
needToBroadcastServerSettings = false;
@ -1960,25 +1960,25 @@ void MenuStateConnectedGame::update() {
if(clientInterface != NULL && clientInterface->isConnected()) {
//printf("#2 admin key [%d] client key [%d]\n",settings->getMasterserver_admin(),clientInterface->getSessionKey());
broadCastGameSettingsToMasterserver(false);
broadCastGameSettingsToHeadlessServer(false);
listBoxMap.setEditable(isMasterserverAdmin());
buttonPlayNow.setVisible(isMasterserverAdmin());
buttonRestoreLastSettings.setVisible(isMasterserverAdmin());
listBoxTechTree.setEditable(isMasterserverAdmin());
listBoxTileset.setEditable(isMasterserverAdmin());
listBoxEnableSwitchTeamMode.setEditable(isMasterserverAdmin());
listBoxAISwitchTeamAcceptPercent.setEditable(isMasterserverAdmin());
listBoxFogOfWar.setEditable(isMasterserverAdmin());
listBoxMap.setEditable(isHeadlessAdmin());
buttonPlayNow.setVisible(isHeadlessAdmin());
buttonRestoreLastSettings.setVisible(isHeadlessAdmin());
listBoxTechTree.setEditable(isHeadlessAdmin());
listBoxTileset.setEditable(isHeadlessAdmin());
listBoxEnableSwitchTeamMode.setEditable(isHeadlessAdmin());
listBoxAISwitchTeamAcceptPercent.setEditable(isHeadlessAdmin());
listBoxFogOfWar.setEditable(isHeadlessAdmin());
//listBoxEnableObserverMode.setEditable(isMasterserverAdmin());
listBoxAllowObservers.setEditable(isMasterserverAdmin());
listBoxAllowObservers.setEditable(isHeadlessAdmin());
if(isMasterserverAdmin() == true) {
if(isHeadlessAdmin() == true) {
for(unsigned int i = 0; i < GameConstants::maxPlayers; ++i) {
listBoxControls[i].setEditable(isMasterserverAdmin());
listBoxRMultiplier[i].setEditable(isMasterserverAdmin());
listBoxFactions[i].setEditable(isMasterserverAdmin());
listBoxTeams[i].setEditable(isMasterserverAdmin());
listBoxControls[i].setEditable(isHeadlessAdmin());
listBoxRMultiplier[i].setEditable(isHeadlessAdmin());
listBoxFactions[i].setEditable(isHeadlessAdmin());
listBoxTeams[i].setEditable(isHeadlessAdmin());
}
}
@ -2480,7 +2480,7 @@ void MenuStateConnectedGame::update() {
//bool mustSwitchPlayerName = false;
if(clientInterface->getGameSettingsReceived() &&
lastGameSettingsReceivedCount != clientInterface->getGameSettingsReceivedCount()) {
broadCastGameSettingsToMasterserver(needToBroadcastServerSettings);
broadCastGameSettingsToHeadlessServer(needToBroadcastServerSettings);
lastGameSettingsReceivedCount = clientInterface->getGameSettingsReceivedCount();
bool errorOnMissingData = (clientInterface->getAllowGameDataSynchCheck() == false);
@ -3579,7 +3579,7 @@ void MenuStateConnectedGame::setupUIFromGameSettings(GameSettings *gameSettings,
for(int i=0; i<GameConstants::maxPlayers; ++i) {
listBoxControls[i].setSelectedItemIndex(ctClosed);
if(isMasterserverAdmin() == false) {
if(isHeadlessAdmin() == false) {
listBoxFactions[i].setEditable(false);
listBoxTeams[i].setEditable(false);
}

View File

@ -242,8 +242,8 @@ private:
void loadGameSettings(GameSettings *gameSettings);
void reloadFactions(bool keepExistingSelectedItem,string scenario);
void PlayNow(bool saveGame);
bool isMasterserverAdmin();
void broadCastGameSettingsToMasterserver(bool forceNow);
bool isHeadlessAdmin();
void broadCastGameSettingsToHeadlessServer(bool forceNow);
void updateResourceMultiplier(const int index);
void RestoreLastGameSettings();

View File

@ -39,8 +39,8 @@ using namespace Shared::Util;
const int MASTERSERVER_BROADCAST_MAX_WAIT_RESPONSE_SECONDS = 10;
const int MASTERSERVER_BROADCAST_PUBLISH_SECONDS = 6;
const int MASTERSERVER_BROADCAST_MAP_DELAY_SECONDS = 5;
const int MASTERSERVER_BROADCAST_SETTINGS_SECONDS = 4;
const int BROADCAST_MAP_DELAY_SECONDS = 5;
const int BROADCAST_SETTINGS_SECONDS = 4;
static const char *SAVED_GAME_FILENAME = "lastCustomGamSettings.mgg";
struct FormatString {
@ -60,8 +60,8 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
MenuState(program, mainMenu, "new-game") {
try {
this->masterserverMode = masterserverMode;
if(this->masterserverMode == true) {
this->headlessServerMode = masterserverMode;
if(this->headlessServerMode == true) {
printf("Waiting for players to join and start a game...\n");
}
@ -356,7 +356,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
listBoxPublishServer.init(50, networkPos, 100);
listBoxPublishServer.pushBackItem(lang.get("Yes"));
listBoxPublishServer.pushBackItem(lang.get("No"));
if(this->masterserverMode == true ||
if(this->headlessServerMode == true ||
(openNetworkSlots == true && parentMenuState != pLanGame)) {
listBoxPublishServer.setSelectedItemIndex(0);
}
@ -372,7 +372,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
labelGameName.init(150, networkHeadPos-2*labelOffset,100);
labelGameName.setFont(CoreData::getInstance().getMenuFontBig());
labelGameName.setFont3D(CoreData::getInstance().getMenuFontBig3D());
if(this->masterserverMode == false) {
if(this->headlessServerMode == false) {
labelGameName.setText(defaultPlayerName+"'s game");
}
else {
@ -559,7 +559,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
//init controllers
if(serverInitError == false) {
ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface();
if(this->masterserverMode == true) {
if(this->headlessServerMode == true) {
listBoxControls[0].setSelectedItemIndex(ctNetwork);
}
else {
@ -782,7 +782,7 @@ void MenuStateCustomGame::reloadUI() {
labelGameName.setFont(CoreData::getInstance().getMenuFontBig());
labelGameName.setFont3D(CoreData::getInstance().getMenuFontBig3D());
if(this->masterserverMode == false) {
if(this->headlessServerMode == false) {
labelGameName.setText(defaultPlayerName+"'s game");
}
else {
@ -1670,7 +1670,7 @@ void MenuStateCustomGame::PlayNow(bool saveGame) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
cleanup();
Game *newGame = new Game(program, &gameSettings, this->masterserverMode);
Game *newGame = new Game(program, &gameSettings, this->headlessServerMode);
forceWaitForShutdown = false;
program->setState(newGame);
return;
@ -1732,7 +1732,7 @@ void MenuStateCustomGame::mouseMove(int x, int y, const MouseState *ms) {
}
bool MenuStateCustomGame::isMasterserverMode() const {
return (this->masterserverMode == true && this->masterserverModeMinimalResources == true);
return (this->headlessServerMode == true && this->masterserverModeMinimalResources == true);
//return false;
}
@ -2138,7 +2138,7 @@ void MenuStateCustomGame::update() {
mainMessageBoxState=1;
showMessageBox( masterServererErrorToShow, lang.get("ErrorFromMasterserver"), false);
if(this->masterserverMode == false) {
if(this->headlessServerMode == false) {
listBoxPublishServer.setSelectedItemIndex(1);
}
@ -2156,7 +2156,7 @@ void MenuStateCustomGame::update() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis());
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start();
if(this->masterserverMode == true && serverInterface->getGameSettingsUpdateCount() > lastMasterServerSettingsUpdateCount &&
if(this->headlessServerMode == true && serverInterface->getGameSettingsUpdateCount() > lastMasterServerSettingsUpdateCount &&
serverInterface->getGameSettings() != NULL) {
const GameSettings *settings = serverInterface->getGameSettings();
//printf("\n\n\n\n=====#1 got settings [%d] [%d]:\n%s\n",lastMasterServerSettingsUpdateCount,serverInterface->getGameSettingsUpdateCount(),settings->toString().c_str());
@ -2172,7 +2172,7 @@ void MenuStateCustomGame::update() {
//printf("\n\n\n\n=====#1.1 got settings [%d] [%d]:\n%s\n",lastMasterServerSettingsUpdateCount,serverInterface->getGameSettingsUpdateCount(),gameSettings.toString().c_str());
}
if(this->masterserverMode == true && serverInterface->getMasterserverAdminRequestLaunch() == true) {
if(this->headlessServerMode == true && serverInterface->getMasterserverAdminRequestLaunch() == true) {
serverInterface->setMasterserverAdminRequestLaunch(false);
safeMutex.ReleaseLock();
@ -2405,7 +2405,8 @@ void MenuStateCustomGame::update() {
bool checkDataSynch = (serverInterface->getAllowGameDataSynchCheck() == true &&
needToSetChangedGameSettings == true &&
difftime(time(NULL),lastSetChangedGameSettings) >= MASTERSERVER_BROADCAST_SETTINGS_SECONDS);
(( difftime(time(NULL),lastSetChangedGameSettings) >= BROADCAST_SETTINGS_SECONDS)||
(this->headlessServerMode == true)));
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis());
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start();
@ -2419,15 +2420,15 @@ void MenuStateCustomGame::update() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis());
if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start();
if(this->masterserverMode == true || hasOneNetworkSlotOpen == true) {
if(this->masterserverMode == true) {
if(this->headlessServerMode == true || hasOneNetworkSlotOpen == true) {
if(this->headlessServerMode == true) {
listBoxPublishServer.setSelectedItemIndex(0);
}
listBoxPublishServer.setEditable(true);
//listBoxEnableServerControlledAI.setEditable(true);
// Masterserver always needs one network slot
if(this->masterserverMode == true && hasOneNetworkSlotOpen == false) {
if(this->headlessServerMode == true && hasOneNetworkSlotOpen == false) {
for(int i= 0; i < mapInfo.players; ++i) {
if(listBoxControls[i].getSelectedItemIndex() != ctNetwork &&
listBoxControls[i].getSelectedItemIndex() != ctNetworkUnassigned) {
@ -2469,7 +2470,8 @@ void MenuStateCustomGame::update() {
}
if(needToPublishDelayed) {
// this delay is done to make it possible to switch over maps which are not meant to be distributed
if(difftime(time(NULL), mapPublishingDelayTimer) >= MASTERSERVER_BROADCAST_MAP_DELAY_SECONDS){
if((difftime(time(NULL), mapPublishingDelayTimer) >= BROADCAST_MAP_DELAY_SECONDS) ||
(this->headlessServerMode == true) ){
// after 5 seconds we are allowed to publish again!
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);
@ -2477,8 +2479,8 @@ void MenuStateCustomGame::update() {
needToPublishDelayed=false;
}
}
if(needToPublishDelayed == false || masterserverMode == true) {
bool broadCastSettings = (difftime(time(NULL),lastSetChangedGameSettings) >= MASTERSERVER_BROADCAST_SETTINGS_SECONDS);
if(needToPublishDelayed == false || headlessServerMode == true) {
bool broadCastSettings = (difftime(time(NULL),lastSetChangedGameSettings) >= BROADCAST_SETTINGS_SECONDS);
//printf("broadCastSettings = %d\n",broadCastSettings);
@ -2857,7 +2859,7 @@ void MenuStateCustomGame::simpleTask(BaseThread *callingThread) {
ServerInterface *serverInterface= NetworkManager::getInstance().getServerInterface(false);
if(serverInterface != NULL) {
if(this->masterserverMode == false || (serverInterface->getGameSettingsUpdateCount() <= lastMasterServerSettingsUpdateCount)) {
if(this->headlessServerMode == false || (serverInterface->getGameSettingsUpdateCount() <= lastMasterServerSettingsUpdateCount)) {
GameSettings gameSettings;
loadGameSettings(&gameSettings);
@ -2925,7 +2927,7 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings,bool force
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
if(this->masterserverMode == true && serverInterface->getGameSettingsUpdateCount() > lastMasterServerSettingsUpdateCount &&
if(this->headlessServerMode == true && serverInterface->getGameSettingsUpdateCount() > lastMasterServerSettingsUpdateCount &&
serverInterface->getGameSettings() != NULL) {
const GameSettings *settings = serverInterface->getGameSettings();
//printf("\n\n\n\n=====#3 got settings [%d] [%d]:\n%s\n",lastMasterServerSettingsUpdateCount,serverInterface->getGameSettingsUpdateCount(),settings->toString().c_str());
@ -3193,7 +3195,7 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings,bool force
//printf("this->masterserverMode = %d\n",this->masterserverMode);
if(this->masterserverMode == true) {
if(this->headlessServerMode == true) {
time_t clientConnectedTime = 0;
bool masterserver_admin_found=false;
//printf("mapInfo.players [%d]\n",mapInfo.players);
@ -3618,7 +3620,7 @@ void MenuStateCustomGame::updateControlers() {
}
if(humanPlayer == false) {
if(this->masterserverMode == false) {
if(this->headlessServerMode == false) {
listBoxControls[0].setSelectedItemIndex(ctHuman);
labelPlayerNames[0].setText("");
labelPlayerNames[0].setText(getHumanPlayerName());

View File

@ -193,7 +193,7 @@ private:
vector<pair<string,int32> > factionCRCList;
bool forceWaitForShutdown;
bool masterserverMode;
bool headlessServerMode;
bool masterserverModeMinimalResources;
int lastMasterServerSettingsUpdateCount;

View File

@ -22,6 +22,7 @@
#include <time.h>
#include "util.h"
#include "game_util.h"
#include "map.h"
#include "miniftpserver.h"
#include "window.h"
#include <set>
@ -126,6 +127,7 @@ ServerInterface::ServerInterface(bool publishEnabled) :GameNetworkInterface() {
if (allMaps.empty()) {
throw megaglest_runtime_error("No maps were found!");
}
std::sort(allMaps.begin(),allMaps.end());
results.clear();
copy(allMaps.begin(), allMaps.end(), std::back_inserter(results));
mapFiles = results;
@ -2088,12 +2090,73 @@ void ServerInterface::validateGameSettings(GameSettings *serverGameSettings) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s]\n",__FILE__,__FUNCTION__);
string mapFile = serverGameSettings->getMap();
bool useNext=false;
printf("Trying to set map to [%s]. Current map is [%s]\n",serverGameSettings->getMap().c_str(),gameSettings.getMap().c_str());
if(find(mapFiles.begin(),mapFiles.end(),mapFile) == mapFiles.end()) {
printf("Reverting map from [%s] to [%s]\n",serverGameSettings->getMap().c_str(),gameSettings.getMap().c_str());
printf("map not found on this server\n");
int currentIndex=-1;
string currentMap=gameSettings.getMap();
for (int i=0 ;i<mapFiles.size(); i++) {
string current=mapFiles[i];
if(current==currentMap)
{
currentIndex=i;
break;
}
}
if(currentIndex==-1){
serverGameSettings->setMap(gameSettings.getMap());
} else {
if(mapFile>gameSettings.getMap()){
printf("mapFile>gameSettings [%s] > [%s]\n",mapFile.c_str(),gameSettings.getMap().c_str());
int nextIndex=-1;
for (int i=0 ;i<mapFiles.size(); i++) {
string current=mapFiles[i];
if(current>mapFile)
{
nextIndex=i;
break;
}
}
if(nextIndex>-1){
serverGameSettings->setMap(mapFiles[nextIndex]);
//printf("switch up\n");
} else {
//printf("overflow top\n");
serverGameSettings->setMap(mapFiles[0]);
}
}
else
{
printf("mapFile<gameSettings [%s] < [%s]\n",mapFile.c_str(),gameSettings.getMap().c_str());
int nextIndex=-1;
for (int i=mapFiles.size()-1 ;i>-1; i--) {
string current=mapFiles[i];
if(current<mapFile)
{
nextIndex=i;
break;
}
}
if(nextIndex>-1){
serverGameSettings->setMap(mapFiles[nextIndex]);
//printf("switch down\n");
} else {
//printf("overflow bottom\n");
serverGameSettings->setMap(mapFiles[(mapFiles.size()-1)]);
}
}
printf("switching map from [%s] to [%s]\n",mapFile.c_str(),serverGameSettings->getMap().c_str());
}
serverGameSettings->setMapFilterIndex(gameSettings.getMapFilterIndex());
serverGameSettings->setMap(gameSettings.getMap());
serverGameSettings->setMapCRC(gameSettings.getMapCRC());
Checksum checksum;
string file = Map::getMapPath(serverGameSettings->getMap(),"",false);
checksum.addFile(file);
serverGameSettings->setMapCRC(checksum.getSum());
}
string tilesetFile = serverGameSettings->getTileset();