Explorar o código

Revert "multiplayer load changes"

This reverts commit 368d2c8836cc6e3b5af9cf71e892bf4515f26bda.
Patrick Simmons %!s(int64=11) %!d(string=hai) anos
pai
achega
3685e96042
Modificáronse 2 ficheiros con 65 adicións e 91 borrados
  1. 63 81
      client/Client.cpp
  2. 2 10
      server/CVCMIServer.cpp

+ 63 - 81
client/Client.cpp

@@ -246,68 +246,51 @@ void CClient::loadGame(const std::string & fname, const bool server, const std::
     else
          serv = sh.justConnectToServer(ipaddr,port=="" ? "3030" : port);
 
-    CStopWatch tmh;
-    if(server)
-    {
-        try
-        {
-            std::string clientSaveName = *CResourceHandler::get("local")->getResourceName(ResourceID(fname, EResType::CLIENT_SAVEGAME));
-            std::string controlServerSaveName;
-
-            if (CResourceHandler::get("local")->existsResource(ResourceID(fname, EResType::SERVER_SAVEGAME)))
-            {
-                controlServerSaveName = *CResourceHandler::get("local")->getResourceName(ResourceID(fname, EResType::SERVER_SAVEGAME));
-            }
-            else// create entry for server savegame. Triggered if save was made after launch and not yet present in res handler
-            {
-                controlServerSaveName = clientSaveName.substr(0, clientSaveName.find_last_of(".")) + ".vsgm1";
-                CResourceHandler::get("local")->createResource(controlServerSaveName, true);
-            }
-
-            if(clientSaveName.empty())
-                throw std::runtime_error("Cannot open client part of " + fname);
-            if(controlServerSaveName.empty())
-                throw std::runtime_error("Cannot open server part of " + fname);
-
-            unique_ptr<CLoadFile> loader;
-            {
-                CLoadIntegrityValidator checkingLoader(clientSaveName, controlServerSaveName, minSupportedVersion);
-                loadCommonState(checkingLoader);
-                loader = checkingLoader.decay();
-            }
-            logNetwork->infoStream() << "Loaded common part of save " << tmh.getDiff();
-            const_cast<CGameInfo*>(CGI)->mh = new CMapHandler();
-            const_cast<CGameInfo*>(CGI)->mh->map = gs->map;
-            pathInfo = make_unique<CPathsInfo>(getMapSize());
-            CGI->mh->init();
-            logNetwork->infoStream() <<"Initing maphandler: "<<tmh.getDiff();
-
-            *loader >> *this;
-            logNetwork->infoStream() << "Loaded client part of save " << tmh.getDiff();
-        }
-        catch(std::exception &e)
-        {
-            logGlobal->errorStream() << "Cannot load game " << fname << ". Error: " << e.what();
-            throw; //obviously we cannot continue here
-        }
-    }
+	CStopWatch tmh;
+	try
+	{
+		std::string clientSaveName = *CResourceHandler::get("local")->getResourceName(ResourceID(fname, EResType::CLIENT_SAVEGAME));
+		std::string controlServerSaveName;
 
-    if(server)
-    {
-         serv = sh.connectToServer();
-         (*serv) << *this;
-    }
-    else
-    {
-        (*serv) >> *this;
+		if (CResourceHandler::get("local")->existsResource(ResourceID(fname, EResType::SERVER_SAVEGAME)))
+		{
+			controlServerSaveName = *CResourceHandler::get("local")->getResourceName(ResourceID(fname, EResType::SERVER_SAVEGAME));
+		}
+		else// create entry for server savegame. Triggered if save was made after launch and not yet present in res handler
+		{
+			controlServerSaveName = clientSaveName.substr(0, clientSaveName.find_last_of(".")) + ".vsgm1";
+			CResourceHandler::get("local")->createResource(controlServerSaveName, true);
+		}
+
+		if(clientSaveName.empty())
+			throw std::runtime_error("Cannot open client part of " + fname);
+		if(controlServerSaveName.empty())
+			throw std::runtime_error("Cannot open server part of " + fname);
 
+		unique_ptr<CLoadFile> loader;
+		{
+			CLoadIntegrityValidator checkingLoader(clientSaveName, controlServerSaveName, minSupportedVersion);
+			loadCommonState(checkingLoader);
+			loader = checkingLoader.decay();
+		}
+        logNetwork->infoStream() << "Loaded common part of save " << tmh.getDiff();
 		const_cast<CGameInfo*>(CGI)->mh = new CMapHandler();
-		CGI->mh->map = gs->map;
-        logNetwork->infoStream() <<"Creating mapHandler: "<<tmh.getDiff();
-		CGI->mh->init();
+		const_cast<CGameInfo*>(CGI)->mh->map = gs->map;
 		pathInfo = make_unique<CPathsInfo>(getMapSize());
-        logNetwork->infoStream() <<"Initializing mapHandler (together): "<<tmh.getDiff();
-    }
+		CGI->mh->init();
+        logNetwork->infoStream() <<"Initing maphandler: "<<tmh.getDiff();
+
+		*loader >> *this;
+        logNetwork->infoStream() << "Loaded client part of save " << tmh.getDiff();
+	}
+	catch(std::exception &e)
+	{
+		logGlobal->errorStream() << "Cannot load game " << fname << ". Error: " << e.what();
+		throw; //obviously we cannot continue here
+	}
+
+    if(server)
+         serv = sh.connectToServer();
 
     if(player_==-1)
         player_ = player->getNum();
@@ -330,39 +313,38 @@ void CClient::loadGame(const std::string & fname, const bool server, const std::
               logNetwork->infoStream() << "Server opened savegame properly.";
     }
 
-    std::set<PlayerColor> clientPlayers;
     if(server)
     {
-        for(auto & elem : gs->scenarioOps->playerInfos)
-            if(!std::count(humanplayerindices.begin(),humanplayerindices.end(),elem.first.getNum()) || elem.first==player)
-            {
-                clientPlayers.insert(elem.first);
-                if(elem.first!=player)
-                {
-                    auto AiToGive = aiNameForPlayer(elem.second, false);
-                    logNetwork->infoStream() << boost::format("Player %s will be lead by %s") % elem.first % AiToGive;
-                    installNewPlayerInterface(CDynLibHandler::getNewAI(AiToGive), elem.first);
-                }
-                else
-                {
-                    installNewPlayerInterface(make_shared<CPlayerInterface>(*player),*player);
-                }
-            }
-        clientPlayers.insert(PlayerColor::NEUTRAL);
+         *serv << ui32(gs->scenarioOps->playerInfos.size()+2-loadNumPlayers); //number of players + neutral
+         for(auto & elem : gs->scenarioOps->playerInfos)
+              if(!std::count(humanplayerindices.begin(),humanplayerindices.end(),elem.first.getNum()) || elem.first==player)
+              {
+                  *serv << ui8(elem.first.getNum()); //players
+                  if(elem.first!=player)
+                  {
+                      auto AiToGive = aiNameForPlayer(elem.second, false);
+                      logNetwork->infoStream() << boost::format("Player %s will be lead by %s") % elem.first % AiToGive;
+                      installNewPlayerInterface(CDynLibHandler::getNewAI(AiToGive), elem.first);
+                  }
+                  else
+                  {
+                      installNewPlayerInterface(make_shared<CPlayerInterface>(*player),*player);
+                  }
+              }
+         *serv << ui8(PlayerColor::NEUTRAL.getNum());
     }
     else
     {
-        clientPlayers.insert(*player);
-        installNewPlayerInterface(make_shared<CPlayerInterface>(*player),*player);
+         *serv << ui32(1);
+         *serv << ui8(player->getNum());
+         installNewPlayerInterface(make_shared<CPlayerInterface>(*player),*player);
     }
 
-	serv->enableStackSendingByID();
-	serv->disableSmartPointerSerialization();
-    (*serv) << clientPlayers;
-
     logNetwork->infoStream() <<"Sent info to server: "<<tmh.getDiff();
 
     serv->addStdVecItems(gs);
+	serv->enableStackSendingByID();
+	serv->disableSmartPointerSerialization();
 
     loadNeutralBattleAI();
 

+ 2 - 10
server/CVCMIServer.cpp

@@ -32,12 +32,6 @@
 
 #include "../lib/UnlockGuard.h"
 
-#include "../client/Client.h"
-
-extern template void CClient::serialize<COSer<CSaveFile>>( COSer<CSaveFile> &h, const int version );
-extern template void CClient::serialize<CISer<CConnection>>( CISer<CConnection> &h, const int version );
-extern template void CClient::serialize<COSer<CConnection>>( COSer<CConnection> &h, const int version );
-
 #if defined(__GNUC__) && !defined (__MINGW32__) && !defined(VCMI_ANDROID)
 #include <execinfo.h>
 #endif
@@ -497,13 +491,11 @@ void CVCMIServer::loadGame()
 	c << ui8(0);
 
 	CConnection* cc; //tcp::socket * ss;
-    CClient client_in;
 	for(int i=0; i<clients; i++)
 	{
 		if(!i) 
 		{
 			cc = &c;
-            (*cc) >> client_in;
 		}
 		else
 		{
@@ -516,8 +508,8 @@ void CVCMIServer::loadGame()
 				continue;
 			}
 			cc = new CConnection(s,NAME);
-            (*cc) << client_in;
-		}
+			cc->addStdVecItems(gh.gs);
+		}	
 		gh.conns.insert(cc);
 	}