Fix the CRC refresh on server side

This commit is contained in:
titiger 2021-01-28 01:00:24 +01:00
parent bbd7df55c9
commit bf5fe0f561
2 changed files with 38 additions and 7 deletions

View File

@ -123,6 +123,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu,
lastRecalculatedCRCTechtreeName = "";
initTime= time(NULL); // now
lastTechtreeChange= time(NULL); // now
lastCheckedCRCTilesetValue = 0;
lastCheckedCRCTechtreeValue = 0;
@ -2874,7 +2875,7 @@ void MenuStateCustomGame::update() {
serverInterface->getSlot(i,true)->getNetworkGameDataSynchCheckOkTech() == false) {
{
// Ensure local CRC cache is correct
refreshCRCCache(serverInterface->getGameSettingsPtr());
setRefreshedCrcToGameSettings(serverInterface->getGameSettingsPtr());
}
label = label + " techtree";
@ -4310,9 +4311,10 @@ void MenuStateCustomGame::setupUIFromGameSettings(const GameSettings &gameSettin
}
// ============ PRIVATE ===========================
void MenuStateCustomGame::refreshCRCCache(GameSettings *gameSettings){
void MenuStateCustomGame::setRefreshedCrcToGameSettings(GameSettings *gameSettings){
Config &config = Config::getInstance();
bool forceRefresh=false;
if( gameSettings->getTileset() != "" && lastRecalculatedCRCTilesetName != gameSettings->getTileset() ) {
lastRecalculatedCRCTilesetName=gameSettings->getTileset() ;
// Check if we have calculated the crc since menu_state started
@ -4331,10 +4333,29 @@ void MenuStateCustomGame::refreshCRCCache(GameSettings *gameSettings){
}
}
// no need to deal with map CRC this is always calculated
setCRCsToGameSettings( gameSettings,forceRefresh);
//if( forceRefresh) console.addLine("forced refresh CRCCache");
setCRCsToSettingsInternal( gameSettings,forceRefresh);
}
void MenuStateCustomGame::setCRCsToGameSettings(GameSettings *gameSettings, bool forceRefresh){
void MenuStateCustomGame::setCRCsToGameSettings(GameSettings *gameSettings)
{
//printf("lastTechtreeChange=%f\n",difftime(time(NULL),lastTechtreeChange) );
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
lastTechtreeChange= time(NULL); // now
}
if(this->headlessServerMode == false && difftime(time(NULL),lastTechtreeChange) >5 ) {
// try a forced CRC recalculation if game settings stay the same for 5 seconds.
// it will only recalculted CRC if it was not already done since program start.
setRefreshedCrcToGameSettings(gameSettings);
}
else {
setCRCsToSettingsInternal(gameSettings,false);
}
}
void MenuStateCustomGame::setCRCsToSettingsInternal(GameSettings *gameSettings, bool forceRefresh){
Config &config = Config::getInstance();
if( forceRefresh ==true ){
lastCheckedCRCTilesetName="";
@ -4354,8 +4375,15 @@ void MenuStateCustomGame::setCRCsToGameSettings(GameSettings *gameSettings, bool
if(gameSettings->getTech() != "") {
if(lastCheckedCRCTechtreeName != gameSettings->getTech()) {
//console.addLine("Checking techtree CRC [" + gameSettings->getTech() + "]");
uint32 oldCRC=0;
if( forceRefresh){
oldCRC=getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL,false);
}
lastCheckedCRCTechtreeValue = getFolderTreeContentsCheckSumRecursively(config.getPathListForType(ptTechs,""), "/" + gameSettings->getTech() + "/*", ".xml", NULL,forceRefresh);
if( forceRefresh && lastCheckedCRCTechtreeValue!=oldCRC){
// we really had a bad CRC before!
console.addLine("techtree CRC fixed!");
}
reloadFactions(true,(checkBoxScenario.getValue() == true ? scenarioFiles[listBoxScenario.getSelectedItemIndex()] : ""));
factionCRCList.clear();
for(unsigned int factionIdx = 0; factionIdx < factionFiles.size(); ++factionIdx) {

View File

@ -151,6 +151,8 @@ private:
time_t lastMasterserverPublishing;
time_t lastNetworkPing;
time_t mapPublishingDelayTimer;
time_t lastTechtreeChange;
bool needToPublishDelayed;
bool headlessHasConnectedPlayer;
@ -266,8 +268,9 @@ public:
virtual bool isVideoPlaying();
private:
void setCRCsToGameSettings(GameSettings *gameSettings, bool forceRefresh=false);
void refreshCRCCache(GameSettings *gameSettings);
void setCRCsToSettingsInternal(GameSettings *gameSettings, bool forceRefresh);
void setCRCsToGameSettings(GameSettings *gameSettings);
void setRefreshedCrcToGameSettings(GameSettings *gameSettings);
void setSmallFont(GraphicLabel l);
void lastPlayerDisconnected();
bool hasNetworkGameSettings();