Browse Source

Fixed missing serialization of new types

Ivan Savenko 11 years ago
parent
commit
971a93b4f1

+ 1 - 0
lib/CObjectClassesHandler.cpp

@@ -337,6 +337,7 @@ CObjectClassesHandler::CObjectClassesHandler()
 #define SET_HANDLER(STRING, TYPENAME) handlerConstructors[STRING] = std::make_shared<CDefaultObjectTypeHandler<TYPENAME> >
 
 	// list of all known handlers, hardcoded for now since the only way to add new objects is via C++ code
+	//WARNING: should be in sync with registerTypesMapObjectTypes function
 	SET_HANDLER_CLASS("configurable", CObjectWithRewardConstructor);
 
 	SET_HANDLER("", CGObjectInstance);

+ 2 - 0
lib/CObjectClassesHandler.h

@@ -113,6 +113,8 @@ protected:
 
 	virtual bool objectFilter(const CGObjectInstance *, const ObjectTemplate &) const;
 public:
+	virtual ~AObjectTypeHandler(){}
+
 	void setType(si32 type, si32 subtype);
 
 	/// loads templates from Json structure using fields "base" and "templates"

+ 58 - 0
lib/registerTypes/RegisterTypes.h

@@ -10,6 +10,8 @@
 #include "../CHeroHandler.h"
 #include "../CTownHandler.h"
 #include "../CModHandler.h" //needed?
+#include "../CObjectClassesHandler.h"
+#include "../CObjectConstructor.h"
 
 /*
  * RegisterTypes.h, part of VCMI engine
@@ -72,6 +74,61 @@ void registerTypesMapObjects1(Serializer &s)
 	s.template registerType<CGSeerHut, CGQuestGuard>();
 }
 
+template<typename Serializer>
+void registerTypesMapObjectTypes(Serializer &s)
+{
+	s.template registerType<AObjectTypeHandler, CObjectWithRewardConstructor>();
+
+#define REGISTER_GENERIC_HANDLER(TYPENAME) s.template registerType<AObjectTypeHandler, CDefaultObjectTypeHandler<TYPENAME> >()
+
+	REGISTER_GENERIC_HANDLER(CGObjectInstance);
+	REGISTER_GENERIC_HANDLER(CGMarket);
+	REGISTER_GENERIC_HANDLER(CBank);
+	REGISTER_GENERIC_HANDLER(CCartographer);
+	REGISTER_GENERIC_HANDLER(CGArtifact);
+	REGISTER_GENERIC_HANDLER(CGBlackMarket);
+	REGISTER_GENERIC_HANDLER(CGBoat);
+	REGISTER_GENERIC_HANDLER(CGBonusingObject);
+	REGISTER_GENERIC_HANDLER(CGBorderGate);
+	REGISTER_GENERIC_HANDLER(CGBorderGuard);
+	REGISTER_GENERIC_HANDLER(CGCreature);
+	REGISTER_GENERIC_HANDLER(CGDenOfthieves);
+	REGISTER_GENERIC_HANDLER(CGDwelling);
+	REGISTER_GENERIC_HANDLER(CGEvent);
+	REGISTER_GENERIC_HANDLER(CGGarrison);
+	REGISTER_GENERIC_HANDLER(CGHeroInstance);
+	REGISTER_GENERIC_HANDLER(CGHeroPlaceholder);
+	REGISTER_GENERIC_HANDLER(CGKeymasterTent);
+	REGISTER_GENERIC_HANDLER(CGLighthouse);
+	REGISTER_GENERIC_HANDLER(CGMagi);
+	REGISTER_GENERIC_HANDLER(CGMagicSpring);
+	REGISTER_GENERIC_HANDLER(CGMagicWell);
+	REGISTER_GENERIC_HANDLER(CGMarket);
+	REGISTER_GENERIC_HANDLER(CGMine);
+	REGISTER_GENERIC_HANDLER(CGObelisk);
+	REGISTER_GENERIC_HANDLER(CGObservatory);
+	REGISTER_GENERIC_HANDLER(CGOnceVisitable);
+	REGISTER_GENERIC_HANDLER(CGPandoraBox);
+	REGISTER_GENERIC_HANDLER(CGPickable);
+	REGISTER_GENERIC_HANDLER(CGPyramid);
+	REGISTER_GENERIC_HANDLER(CGQuestGuard);
+	REGISTER_GENERIC_HANDLER(CGResource);
+	REGISTER_GENERIC_HANDLER(CGScholar);
+	REGISTER_GENERIC_HANDLER(CGSeerHut);
+	REGISTER_GENERIC_HANDLER(CGShipyard);
+	REGISTER_GENERIC_HANDLER(CGShrine);
+	REGISTER_GENERIC_HANDLER(CGSignBottle);
+	REGISTER_GENERIC_HANDLER(CGSirens);
+	REGISTER_GENERIC_HANDLER(CGTeleport);
+	REGISTER_GENERIC_HANDLER(CGTownInstance);
+	REGISTER_GENERIC_HANDLER(CGUniversity);
+	REGISTER_GENERIC_HANDLER(CGVisitableOPH);
+	REGISTER_GENERIC_HANDLER(CGVisitableOPW);
+	REGISTER_GENERIC_HANDLER(CGWitchHut);
+
+#undef REGISTER_GENERIC_HANDLER
+}
+
 template<typename Serializer>
 void registerTypesMapObjects2(Serializer &s)
 {
@@ -302,6 +359,7 @@ void registerTypes(Serializer &s)
 {
 	registerTypesMapObjects1(s);
 	registerTypesMapObjects2(s);
+	registerTypesMapObjectTypes(s);
 	registerTypesClientPacks1(s);
 	registerTypesClientPacks2(s);
 	registerTypesServerPacks(s);

+ 8 - 0
lib/registerTypes/TypesMapObjects1.cpp

@@ -18,6 +18,14 @@
 #include "../NetPacks.h"
 #include "../CObjectClassesHandler.h"
 
+template void registerTypesMapObjectTypes<CISer<CConnection>>(CISer<CConnection>& s);
+template void registerTypesMapObjectTypes<COSer<CConnection>>(COSer<CConnection>& s);
+template void registerTypesMapObjectTypes<CISer<CMemorySerializer>>(CISer<CMemorySerializer>& s);
+template void registerTypesMapObjectTypes<COSer<CMemorySerializer>>(COSer<CMemorySerializer>& s);
+template void registerTypesMapObjectTypes<CSaveFile>(CSaveFile & s);
+template void registerTypesMapObjectTypes<CLoadFile>(CLoadFile & s);
+template void registerTypesMapObjectTypes<CTypeList>(CTypeList & s);
+template void registerTypesMapObjectTypes<CLoadIntegrityValidator>(CLoadIntegrityValidator & s);
 
 template void registerTypesMapObjects1<CISer<CConnection>>(CISer<CConnection>& s);
 template void registerTypesMapObjects1<COSer<CConnection>>(COSer<CConnection>& s);