bugfix to force server to refresh CRC if client has different CRC

This commit is contained in:
Mark Vejvoda 2013-06-23 05:23:02 +00:00
parent d46479df95
commit c88c631010
2 changed files with 113 additions and 65 deletions

View File

@ -98,6 +98,11 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
lastCheckedCRCTilesetName = "";
lastCheckedCRCTechtreeName = "";
lastCheckedCRCMapName = "";
last_Forced_CheckedCRCTilesetName = "";
last_Forced_CheckedCRCTechtreeName = "";
last_Forced_CheckedCRCMapName = "";
lastCheckedCRCTilesetValue = -1;
lastCheckedCRCTechtreeValue = -1;
lastCheckedCRCMapValue = -1;
@ -1492,6 +1497,40 @@ void MenuStateCustomGame::RestoreLastGameSettings() {
loadGameSettings(SAVED_GAME_FILENAME);
}
bool MenuStateCustomGame::checkNetworkPlayerDataSynch(bool checkMapCRC,
bool checkTileSetCRC, bool checkTechTreeCRC) {
ServerInterface* serverInterface = NetworkManager::getInstance().getServerInterface();
bool dataSynchCheckOk = true;
for(int i= 0; i < mapInfo.players; ++i) {
if(listBoxControls[i].getSelectedItemIndex() == ctNetwork) {
ConnectionSlot *slot = serverInterface->getSlot(i);
if( slot != NULL && slot->isConnected() &&
(slot->getAllowDownloadDataSynch() == true ||
slot->getAllowGameDataSynchCheck() == true)) {
if(checkMapCRC == true &&
slot->getNetworkGameDataSynchCheckOkMap() == false) {
dataSynchCheckOk = false;
break;
}
if(checkTileSetCRC == true &&
slot->getNetworkGameDataSynchCheckOkTile() == false) {
dataSynchCheckOk = false;
break;
}
if(checkTechTreeCRC == true &&
slot->getNetworkGameDataSynchCheckOkTech() == false) {
dataSynchCheckOk = false;
break;
}
}
}
}
return dataSynchCheckOk;
}
void MenuStateCustomGame::PlayNow(bool saveGame) {
MutexSafeWrapper safeMutex((publishToMasterserverThread != NULL ? publishToMasterserverThread->getMutexThreadObjectAccessor() : NULL),string(__FILE__) + "_" + intToStr(__LINE__));
if(saveGame == true) {
@ -1575,22 +1614,7 @@ void MenuStateCustomGame::PlayNow(bool saveGame) {
// Send the game settings to each client if we have at least one networked client
safeMutex.Lock();
bool dataSynchCheckOk = true;
for(int i= 0; i < mapInfo.players; ++i) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
if(listBoxControls[i].getSelectedItemIndex() == ctNetwork) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
if( serverInterface->getSlot(i) != NULL && serverInterface->getSlot(i)->isConnected() &&
(serverInterface->getSlot(i)->getAllowDownloadDataSynch() == true || serverInterface->getSlot(i)->getAllowGameDataSynchCheck() == true) &&
serverInterface->getSlot(i)->getNetworkGameDataSynchCheckOk() == false) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__);
dataSynchCheckOk = false;
break;
}
}
}
bool dataSynchCheckOk = checkNetworkPlayerDataSynch(true, true, true);
// Ensure we have no dangling network players
for(int i= 0; i < GameConstants::maxPlayers; ++i) {
@ -3314,66 +3338,82 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings,bool force
gameSettings->setNetworkFramePeriod(config.getInt("NetworkSendFrameCount","20"));
gameSettings->setNetworkPauseGameForLaggedClients(((checkBoxNetworkPauseGameForLaggedClients.getValue() == true)));
//if(hasNetworkGameSettings() == true) {
{
if( gameSettings->getTileset() != "") {
if(lastCheckedCRCTilesetName != gameSettings->getTileset()) {
//console.addLine("Checking tileset CRC [" + gameSettings->getTileset() + "]");
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL);
if(lastCheckedCRCTilesetValue == 0) {
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL, true);
}
lastCheckedCRCTilesetName = gameSettings->getTileset();
}
gameSettings->setTilesetCRC(lastCheckedCRCTilesetValue);
if( gameSettings->getTileset() != "") {
// Check if client has different data, if so force a CRC refresh
if(checkNetworkPlayerDataSynch(false,true, false) == false &&
last_Forced_CheckedCRCTilesetName != gameSettings->getTileset()) {
lastCheckedCRCTilesetName = "";
last_Forced_CheckedCRCTilesetName = gameSettings->getTileset();
}
if(config.getBool("DisableServerLobbyTechtreeCRCCheck","false") == false) {
if(gameSettings->getTech() != "") {
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
//console.addLine("Checking techtree CRC [" + gameSettings->getTech() + "]");
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL);
if(lastCheckedCRCTechtreeValue == 0) {
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL, true);
}
if(lastCheckedCRCTilesetName != gameSettings->getTileset()) {
//console.addLine("Checking tileset CRC [" + gameSettings->getTileset() + "]");
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL);
if(lastCheckedCRCTilesetValue == 0) {
lastCheckedCRCTilesetValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTilesets,""), string("/") + gameSettings->getTileset() + string("/*"), ".xml", NULL, true);
}
lastCheckedCRCTilesetName = gameSettings->getTileset();
}
gameSettings->setTilesetCRC(lastCheckedCRCTilesetValue);
}
reloadFactions(true,(checkBoxScenario.getValue() == true ? scenarioFiles[listBoxScenario.getSelectedItemIndex()] : ""));
factionCRCList.clear();
for(unsigned int factionIdx = 0; factionIdx < factionFiles.size(); ++factionIdx) {
string factionName = factionFiles[factionIdx];
if(factionName != GameConstants::RANDOMFACTION_SLOTNAME &&
factionName != GameConstants::OBSERVER_SLOTNAME) {
//factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
uint32 factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL);
if(factionCRC == 0) {
factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
}
factionCRCList.push_back(make_pair(factionName,factionCRC));
if(config.getBool("DisableServerLobbyTechtreeCRCCheck","false") == false) {
if(gameSettings->getTech() != "") {
// Check if client has different data, if so force a CRC refresh
if(checkNetworkPlayerDataSynch(false,false,true) == false &&
last_Forced_CheckedCRCTechtreeName != gameSettings->getTech()) {
lastCheckedCRCTechtreeName = "";
last_Forced_CheckedCRCTechtreeName = gameSettings->getTech();
}
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
//console.addLine("Checking techtree CRC [" + gameSettings->getTech() + "]");
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL);
if(lastCheckedCRCTechtreeValue == 0) {
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL, true);
}
reloadFactions(true,(checkBoxScenario.getValue() == true ? scenarioFiles[listBoxScenario.getSelectedItemIndex()] : ""));
factionCRCList.clear();
for(unsigned int factionIdx = 0; factionIdx < factionFiles.size(); ++factionIdx) {
string factionName = factionFiles[factionIdx];
if(factionName != GameConstants::RANDOMFACTION_SLOTNAME &&
factionName != GameConstants::OBSERVER_SLOTNAME) {
//factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
uint32 factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL);
if(factionCRC == 0) {
factionCRC = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/factions/" + factionName + "/*", ".xml", NULL, true);
}
factionCRCList.push_back(make_pair(factionName,factionCRC));
}
//console.addLine("Found factions: " + intToStr(factionCRCList.size()));
lastCheckedCRCTechtreeName = gameSettings->getTech();
}
gameSettings->setFactionCRCList(factionCRCList);
gameSettings->setTechCRC(lastCheckedCRCTechtreeValue);
//console.addLine("Found factions: " + intToStr(factionCRCList.size()));
lastCheckedCRCTechtreeName = gameSettings->getTech();
}
}
if(gameSettings->getMap() != "") {
if(lastCheckedCRCMapName != gameSettings->getMap()) {
Checksum checksum;
string file = Map::getMapPath(gameSettings->getMap(),"",false);
//console.addLine("Checking map CRC [" + file + "]");
checksum.addFile(file);
lastCheckedCRCMapValue = checksum.getSum();
lastCheckedCRCMapName = gameSettings->getMap();
}
gameSettings->setMapCRC(lastCheckedCRCMapValue);
gameSettings->setFactionCRCList(factionCRCList);
gameSettings->setTechCRC(lastCheckedCRCTechtreeValue);
}
}
//printf("this->masterserverMode = %d\n",this->masterserverMode);
if(gameSettings->getMap() != "") {
// Check if client has different data, if so force a CRC refresh
if(checkNetworkPlayerDataSynch(true,false,false) == false &&
last_Forced_CheckedCRCMapName != gameSettings->getMap()) {
lastCheckedCRCMapName = "";
last_Forced_CheckedCRCMapName = gameSettings->getMap();
}
if(lastCheckedCRCMapName != gameSettings->getMap()) {
Checksum checksum;
string file = Map::getMapPath(gameSettings->getMap(),"",false);
//console.addLine("Checking map CRC [" + file + "]");
checksum.addFile(file);
lastCheckedCRCMapValue = checksum.getSum();
lastCheckedCRCMapName = gameSettings->getMap();
}
gameSettings->setMapCRC(lastCheckedCRCMapValue);
}
if(this->headlessServerMode == true) {
time_t clientConnectedTime = 0;

View File

@ -203,6 +203,11 @@ private:
string lastCheckedCRCTilesetName;
string lastCheckedCRCTechtreeName;
string lastCheckedCRCMapName;
string last_Forced_CheckedCRCTilesetName;
string last_Forced_CheckedCRCTechtreeName;
string last_Forced_CheckedCRCMapName;
uint32 lastCheckedCRCTilesetValue;
uint32 lastCheckedCRCTechtreeValue;
uint32 lastCheckedCRCMapValue;
@ -291,6 +296,9 @@ private:
void setupTilesetList(string scenario);
void initFactionPreview(const GameSettings *gameSettings);
bool checkNetworkPlayerDataSynch(bool checkMapCRC,bool checkTileSetCRC, bool checkTechTreeCRC);
};
}}//end namespace