mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	client is able to erase artifact
This commit is contained in:
		| @@ -185,6 +185,12 @@ void CCallback::bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dst | ||||
| 	sendRequest(&bma); | ||||
| } | ||||
|  | ||||
| void CCallback::eraseArtifactByClient(const ArtifactLocation & al) | ||||
| { | ||||
| 	EraseArtifactByClient ea(al); | ||||
| 	sendRequest(&ea); | ||||
| } | ||||
|  | ||||
| bool CCallback::buildBuilding(const CGTownInstance *town, BuildingID buildingID) | ||||
| { | ||||
| 	if(town->tempOwner!=player) | ||||
|   | ||||
| @@ -85,6 +85,7 @@ public: | ||||
| 	//virtual bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2)=0; //swaps artifacts between two given heroes | ||||
| 	virtual bool swapArtifacts(const ArtifactLocation &l1, const ArtifactLocation &l2)=0; | ||||
| 	virtual bool assembleArtifacts(const CGHeroInstance * hero, ArtifactPosition artifactSlot, bool assemble, ArtifactID assembleTo)=0; | ||||
| 	virtual void eraseArtifactByClient(const ArtifactLocation & al)=0; | ||||
| 	virtual bool dismissCreature(const CArmedInstance *obj, SlotID stackPos)=0; | ||||
| 	virtual void endTurn()=0; | ||||
| 	virtual void buyArtifact(const CGHeroInstance *hero, ArtifactID aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith) | ||||
| @@ -159,6 +160,7 @@ public: | ||||
| 	bool swapArtifacts(const ArtifactLocation &l1, const ArtifactLocation &l2) override; | ||||
| 	bool assembleArtifacts(const CGHeroInstance * hero, ArtifactPosition artifactSlot, bool assemble, ArtifactID assembleTo) override; | ||||
| 	void bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dstHero, bool swap) override; | ||||
| 	void eraseArtifactByClient(const ArtifactLocation & al) override; | ||||
| 	bool buildBuilding(const CGTownInstance *town, BuildingID buildingID) override; | ||||
| 	void recruitCreatures(const CGDwelling * obj, const CArmedInstance * dst, CreatureID ID, ui32 amount, si32 level=-1) override; | ||||
| 	bool dismissCreature(const CArmedInstance *obj, SlotID stackPos) override; | ||||
|   | ||||
| @@ -654,7 +654,7 @@ CArtifactsOfHero::~CArtifactsOfHero() | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			//TODO remove artifact | ||||
| 			LOCPLINT->cb->eraseArtifactByClient(ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS)); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -126,6 +126,7 @@ public: | ||||
| 	virtual void visitExchangeArtifacts(ExchangeArtifacts & pack) {} | ||||
| 	virtual void visitBulkExchangeArtifacts(BulkExchangeArtifacts & pack) {} | ||||
| 	virtual void visitAssembleArtifacts(AssembleArtifacts & pack) {} | ||||
| 	virtual void visitEraseArtifactByClient(EraseArtifactByClient & pack) {} | ||||
| 	virtual void visitBuyArtifact(BuyArtifact & pack) {} | ||||
| 	virtual void visitTradeOnMarketplace(TradeOnMarketplace & pack) {} | ||||
| 	virtual void visitSetFormation(SetFormation & pack) {} | ||||
|   | ||||
| @@ -2298,6 +2298,24 @@ struct DLL_LINKAGE AssembleArtifacts : public CPackForServer | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| struct DLL_LINKAGE EraseArtifactByClient : public CPackForServer | ||||
| { | ||||
| 	EraseArtifactByClient() = default; | ||||
| 	EraseArtifactByClient(const ArtifactLocation & al) | ||||
| 		: al(al) | ||||
| 	{ | ||||
| 	} | ||||
| 	ArtifactLocation al; | ||||
|  | ||||
| 	virtual void visitTyped(ICPackVisitor & visitor) override; | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler & h, const int version) | ||||
| 	{ | ||||
| 		h & static_cast<CPackForServer&>(*this); | ||||
| 		h & al; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| struct DLL_LINKAGE BuyArtifact : public CPackForServer | ||||
| { | ||||
| 	BuyArtifact() = default; | ||||
|   | ||||
| @@ -593,6 +593,11 @@ void AssembleArtifacts::visitTyped(ICPackVisitor & visitor) | ||||
| 	visitor.visitAssembleArtifacts(*this); | ||||
| } | ||||
|  | ||||
| void EraseArtifactByClient::visitTyped(ICPackVisitor & visitor) | ||||
| { | ||||
| 	visitor.visitEraseArtifactByClient(*this); | ||||
| } | ||||
|  | ||||
| void BuyArtifact::visitTyped(ICPackVisitor & visitor) | ||||
| { | ||||
| 	visitor.visitBuyArtifact(*this); | ||||
|   | ||||
| @@ -346,6 +346,7 @@ void registerTypesServerPacks(Serializer &s) | ||||
| 	s.template registerType<CPackForServer, BulkSmartSplitStack>(); | ||||
| 	s.template registerType<CPackForServer, BulkMoveArmy>(); | ||||
| 	s.template registerType<CPackForServer, BulkExchangeArtifacts>(); | ||||
| 	s.template registerType<CPackForServer, EraseArtifactByClient>(); | ||||
| } | ||||
|  | ||||
| template<typename Serializer> | ||||
|   | ||||
| @@ -4063,6 +4063,23 @@ bool CGameHandler::assembleArtifacts (ObjectInstanceID heroID, ArtifactPosition | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::eraseArtifactByClient(const ArtifactLocation & al) | ||||
| { | ||||
| 	const auto * hero = getHero(al.relatedObj()->id); | ||||
| 	if(hero == nullptr) | ||||
| 		COMPLAIN_RET("eraseArtifactByClient: wrong hero's ID"); | ||||
|  | ||||
| 	const auto * art = al.getArt(); | ||||
| 	if(art == nullptr) | ||||
| 		COMPLAIN_RET("Cannot remove artifact!"); | ||||
|  | ||||
| 	if(al.getArt()->artType->canBePutAt(hero) || al.slot != ArtifactPosition::TRANSITION_POS) | ||||
| 		COMPLAIN_RET("Unlegal removing artifact"); | ||||
|  | ||||
| 	removeArtifact(al); | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::buyArtifact(ObjectInstanceID hid, ArtifactID aid) | ||||
| { | ||||
| 	const CGHeroInstance * hero = getHero(hid); | ||||
|   | ||||
| @@ -182,6 +182,7 @@ public: | ||||
| 	void removeArtifact(const ArtifactLocation &al) override; | ||||
| 	bool moveArtifact(const ArtifactLocation & al1, const ArtifactLocation & al2) override; | ||||
| 	bool bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dstHero, bool swap); | ||||
| 	bool eraseArtifactByClient(const ArtifactLocation & al); | ||||
| 	void synchronizeArtifactHandlerLists(); | ||||
|  | ||||
| 	void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) override; | ||||
|   | ||||
| @@ -374,6 +374,12 @@ bool CGarrisonDialogQuery::blocksPack(const CPack * pack) const | ||||
| 	if(auto arts = dynamic_ptr_cast<BulkExchangeArtifacts>(pack)) | ||||
| 		return !vstd::contains(ourIds, arts->srcHero) || !vstd::contains(ourIds, arts->dstHero); | ||||
|  | ||||
| 	if(auto art = dynamic_ptr_cast<EraseArtifactByClient>(pack)) | ||||
| 	{ | ||||
| 		if (auto id = boost::apply_visitor(GetEngagedHeroIds(), art->al.artHolder)) | ||||
| 			return !vstd::contains(ourIds, *id); | ||||
| 	} | ||||
|  | ||||
| 	if(auto dismiss = dynamic_ptr_cast<AssembleArtifacts>(pack)) | ||||
| 		return !vstd::contains(ourIds, dismiss->heroID); | ||||
|  | ||||
|   | ||||
| @@ -146,6 +146,12 @@ void ApplyGhNetPackVisitor::visitAssembleArtifacts(AssembleArtifacts & pack) | ||||
| 	result = gh.assembleArtifacts(pack.heroID, pack.artifactSlot, pack.assemble, pack.assembleTo); | ||||
| } | ||||
|  | ||||
| void ApplyGhNetPackVisitor::visitEraseArtifactByClient(EraseArtifactByClient & pack) | ||||
| { | ||||
| 	gh.throwOnWrongPlayer(&pack, pack.al.owningPlayer()); | ||||
| 	result = gh.eraseArtifactByClient(pack.al); | ||||
| } | ||||
|  | ||||
| void ApplyGhNetPackVisitor::visitBuyArtifact(BuyArtifact & pack) | ||||
| { | ||||
| 	gh.throwOnWrongOwner(&pack, pack.hid); | ||||
|   | ||||
| @@ -47,6 +47,7 @@ public: | ||||
| 	virtual void visitExchangeArtifacts(ExchangeArtifacts & pack) override; | ||||
| 	virtual void visitBulkExchangeArtifacts(BulkExchangeArtifacts & pack) override; | ||||
| 	virtual void visitAssembleArtifacts(AssembleArtifacts & pack) override; | ||||
| 	virtual void visitEraseArtifactByClient(EraseArtifactByClient & pack) override; | ||||
| 	virtual void visitBuyArtifact(BuyArtifact & pack) override; | ||||
| 	virtual void visitTradeOnMarketplace(TradeOnMarketplace & pack) override; | ||||
| 	virtual void visitSetFormation(SetFormation & pack) override; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user