mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Implemented simple versioning system for multiplayer
This commit is contained in:
		| @@ -43,6 +43,7 @@ void ApplyOnLobbyHandlerNetPackVisitor::visitLobbyClientConnected(LobbyClientCon | |||||||
| 	// Check if it's LobbyClientConnected for our client | 	// Check if it's LobbyClientConnected for our client | ||||||
| 	if(pack.uuid == handler.logicConnection->uuid) | 	if(pack.uuid == handler.logicConnection->uuid) | ||||||
| 	{ | 	{ | ||||||
|  | 		handler.logicConnection->setSerializationVersion(pack.version); | ||||||
| 		handler.logicConnection->connectionID = pack.clientId; | 		handler.logicConnection->connectionID = pack.clientId; | ||||||
| 		if(handler.mapToStart) | 		if(handler.mapToStart) | ||||||
| 		{ | 		{ | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ public: | |||||||
| 		h & coastVisitable; | 		h & coastVisitable; | ||||||
| 		if (h.version >= Handler::Version::BANK_UNIT_PLACEMENT) | 		if (h.version >= Handler::Version::BANK_UNIT_PLACEMENT) | ||||||
| 			h & regularUnitPlacement; | 			h & regularUnitPlacement; | ||||||
| 		else | 		else if (!h.saving) | ||||||
| 			regularUnitPlacement = false; | 			regularUnitPlacement = false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
| #include "StartInfo.h" | #include "StartInfo.h" | ||||||
| #include "NetPacksBase.h" | #include "NetPacksBase.h" | ||||||
| #include "../MetaString.h" | #include "../MetaString.h" | ||||||
|  | #include "../serializer/ESerializationVersion.h" | ||||||
|  |  | ||||||
| class CServerHandler; | class CServerHandler; | ||||||
| class CVCMIServer; | class CVCMIServer; | ||||||
| @@ -42,6 +43,7 @@ struct DLL_LINKAGE LobbyClientConnected : public CLobbyPackToPropagate | |||||||
| 	// Changed by server before announcing pack | 	// Changed by server before announcing pack | ||||||
| 	int clientId = -1; | 	int clientId = -1; | ||||||
| 	int hostClientId = -1; | 	int hostClientId = -1; | ||||||
|  | 	ESerializationVersion version = ESerializationVersion::CURRENT; | ||||||
|  |  | ||||||
| 	void visitTyped(ICPackVisitor & visitor) override; | 	void visitTyped(ICPackVisitor & visitor) override; | ||||||
|  |  | ||||||
| @@ -53,6 +55,18 @@ struct DLL_LINKAGE LobbyClientConnected : public CLobbyPackToPropagate | |||||||
|  |  | ||||||
| 		h & clientId; | 		h & clientId; | ||||||
| 		h & hostClientId; | 		h & hostClientId; | ||||||
|  |  | ||||||
|  | 		try | ||||||
|  | 		{ | ||||||
|  | 			if (h.version >= Handler::Version::RELEASE_152) | ||||||
|  | 				h & version; | ||||||
|  | 			else | ||||||
|  | 				version = ESerializationVersion::RELEASE_150; | ||||||
|  | 		} | ||||||
|  | 		 catch (const std::runtime_error & e) | ||||||
|  | 		{ | ||||||
|  | 			version = ESerializationVersion::RELEASE_150; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -115,7 +115,7 @@ public: | |||||||
|  |  | ||||||
| 	std::map<const void*, ui32> savedPointers; | 	std::map<const void*, ui32> savedPointers; | ||||||
|  |  | ||||||
| 	const Version version = Version::CURRENT; | 	Version version = Version::CURRENT; | ||||||
| 	bool smartPointerSerialization; | 	bool smartPointerSerialization; | ||||||
| 	bool saving; | 	bool saving; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -173,4 +173,10 @@ void CConnection::enableSmartVectorMemberSerializatoin(CGameState * gs) | |||||||
| 	packReader->addStdVecItems(gs); | 	packReader->addStdVecItems(gs); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void CConnection::setSerializationVersion(ESerializationVersion version) | ||||||
|  | { | ||||||
|  | 	deserializer->version = version; | ||||||
|  | 	serializer->version = version; | ||||||
|  | } | ||||||
|  |  | ||||||
| VCMI_LIB_NAMESPACE_END | VCMI_LIB_NAMESPACE_END | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ | |||||||
|  */ |  */ | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
|  | enum class ESerializationVersion : int32_t; | ||||||
|  |  | ||||||
| VCMI_LIB_NAMESPACE_BEGIN | VCMI_LIB_NAMESPACE_BEGIN | ||||||
|  |  | ||||||
| class BinaryDeserializer; | class BinaryDeserializer; | ||||||
| @@ -57,6 +59,7 @@ public: | |||||||
| 	void enterLobbyConnectionMode(); | 	void enterLobbyConnectionMode(); | ||||||
| 	void setCallback(IGameCallback * cb); | 	void setCallback(IGameCallback * cb); | ||||||
| 	void enterGameplayConnectionMode(CGameState * gs); | 	void enterGameplayConnectionMode(CGameState * gs); | ||||||
|  | 	void setSerializationVersion(ESerializationVersion version); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| VCMI_LIB_NAMESPACE_END | VCMI_LIB_NAMESPACE_END | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ enum class ESerializationVersion : int32_t | |||||||
| 	NONE = 0, | 	NONE = 0, | ||||||
|  |  | ||||||
| 	MINIMAL = 831, | 	MINIMAL = 831, | ||||||
|  |  | ||||||
| 	RELEASE_143, // 832 +text container in campaigns, +starting hero in RMG options | 	RELEASE_143, // 832 +text container in campaigns, +starting hero in RMG options | ||||||
| 	HAS_EXTRA_OPTIONS, // 833 +extra options struct as part of startinfo | 	HAS_EXTRA_OPTIONS, // 833 +extra options struct as part of startinfo | ||||||
| 	DESTROYED_OBJECTS, // 834 +list of objects destroyed by player | 	DESTROYED_OBJECTS, // 834 +list of objects destroyed by player | ||||||
| @@ -43,10 +44,12 @@ enum class ESerializationVersion : int32_t | |||||||
| 	ARTIFACT_COSTUMES, // 840 swappable artifacts set added | 	ARTIFACT_COSTUMES, // 840 swappable artifacts set added | ||||||
|  |  | ||||||
| 	RELEASE_150 = ARTIFACT_COSTUMES, // for convenience | 	RELEASE_150 = ARTIFACT_COSTUMES, // for convenience | ||||||
| 	VOTING_SIMTURNS, // 841 - allow modification of simturns duration via vote |  | ||||||
|  |  | ||||||
| 	REMOVE_TEXT_CONTAINER_SIZE_T, // Fixed serialization of size_t from text containers | 	VOTING_SIMTURNS, // 841 - allow modification of simturns duration via vote | ||||||
| 	BANK_UNIT_PLACEMENT, // 842 | 	REMOVE_TEXT_CONTAINER_SIZE_T, // 842 Fixed serialization of size_t from text containers | ||||||
|  | 	BANK_UNIT_PLACEMENT, // 843 Banks have unit placement flag | ||||||
|  |  | ||||||
|  | 	RELEASE_152 = BANK_UNIT_PLACEMENT, | ||||||
|  |  | ||||||
| 	CURRENT = BANK_UNIT_PLACEMENT | 	CURRENT = BANK_UNIT_PLACEMENT | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -46,11 +46,16 @@ void ClientPermissionsCheckerNetPackVisitor::visitLobbyClientConnected(LobbyClie | |||||||
|  |  | ||||||
| void ApplyOnServerNetPackVisitor::visitLobbyClientConnected(LobbyClientConnected & pack) | void ApplyOnServerNetPackVisitor::visitLobbyClientConnected(LobbyClientConnected & pack) | ||||||
| { | { | ||||||
|  | 	auto compatibleVersion = std::min(pack.version, ESerializationVersion::CURRENT); | ||||||
|  | 	pack.c->setSerializationVersion(compatibleVersion); | ||||||
|  |  | ||||||
| 	srv.clientConnected(pack.c, pack.names, pack.uuid, pack.mode); | 	srv.clientConnected(pack.c, pack.names, pack.uuid, pack.mode); | ||||||
|  |  | ||||||
| 	// Server need to pass some data to newly connected client | 	// Server need to pass some data to newly connected client | ||||||
| 	pack.clientId = pack.c->connectionID; | 	pack.clientId = pack.c->connectionID; | ||||||
| 	pack.mode = srv.si->mode; | 	pack.mode = srv.si->mode; | ||||||
| 	pack.hostClientId = srv.hostClientId; | 	pack.hostClientId = srv.hostClientId; | ||||||
|  | 	pack.version = compatibleVersion; | ||||||
|  |  | ||||||
| 	result = true; | 	result = true; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -113,5 +113,10 @@ public: | |||||||
| 			h & simturnsMinDurationDays; | 			h & simturnsMinDurationDays; | ||||||
| 			h & simturnsMaxDurationDays; | 			h & simturnsMaxDurationDays; | ||||||
| 		} | 		} | ||||||
|  | 		else if (!h.saving) | ||||||
|  | 		{ | ||||||
|  | 			simturnsMinDurationDays.reset(); | ||||||
|  | 			simturnsMaxDurationDays.reset(); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user